from:  http://thinkinjava.cn/2018/10/%E4%BD%BF%E7%94%A8-Cglib-%E5%AE%9E%E7%8E%B0%E5%A4%9A%E9%87%8D%E4%BB%A3%E7%90%86/ ,  https://blog.csdn.net/ahilll/article/details/82943836

/*
简单实现 Cglib 多重代理
先说一下思路:事实上很简单,只需要再拦截器里放一个过滤器链即可,用户在过滤器里拦截多重调用。
这些拦截器,就像你加 @Around 注解的方法,只不过我们这里没有 Spring 那么方便而已。
*/
public class Test {
public static void main(String[] args) {
Object proxy = ProxyFactory.create().getProxy(new SayHello());
proxy.toString();
} static class SayHello {
@Override
public String toString() {
return "hello cglib !";
}
}
}

核心代理工厂:

public class ProxyFactory {
private ProxyFactory() {}
public static ProxyFactory create() {
return new ProxyFactory();
}
public Object getProxy(Object origin) {
final Enhancer en = new Enhancer();
en.setSuperclass(origin.getClass());
List<Chain.PointInterface> list = new ArrayList<>();
list.add(new PointInterface1());
list.add(new PointInterface2());
System.out.println("---12->进入了 获取代理对象的方法: getProxy(Object origin)");
en.setCallback(new SpringCglibProxyInterceptor(new Chain(list, origin)));
return en.create();
}
private class SpringCglibProxyInterceptor implements MethodInterceptor {//在这个拦截器里放一个过滤器链 SpringCglibProxy
Chain chain;
public SpringCglibProxyInterceptor(Chain chain) {
System.out.println("---13->进入了 SpringCglibProxyInterceptor的构造方法");
this.chain = chain;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
throws Throwable {
System.out.println("---14->进入了 SpringCglibProxyInterceptor.class中 基层CglibPoxy接口的实现方法");
return chain.proceed2(); //引入 滤器链
} }
}
public class Chain {
private List<PointInterface> list;
private int index = -1;
private Object target; public Chain(List<PointInterface> list, Object target) {
System.out.println("---12.1->进入了 SpringCglibProxyInterceptor构造方法中的对象参数Chain的构造方法");
this.list = list;
this.target = target;
} //滤器链
public Object proceed2() throws InterruptedException {
System.out.println("---15->进入了 基层CglibPoxy接口的实现方法 调用的proceed2()方法");
Object result;
if (++index == list.size()) { // 这是干正事
result = (target.toString());
System.err.println("---50->干正事-ing-(proceed2()方法中)Target Method invoke result : " + result);
System.err.println("---51->总结:1.切面一次性处理<正事>之前的琐事-->2.干正事-->3.切面一次性处理<正事>之后的琐事 ");
} else { // 这是干正事之前 做的事情
System.err.println("---49->干正事-before-(proceed2()方法中)做的事情--X: "+(index) + "--start");
PointInterface pointInterface = list.get(index);
result = pointInterface.proceed3(this);
System.err.println("---49->干正事-before-(proceed2()方法中)做的事情--X: "+(index) + "--end");
}
return result;
}
interface PointInterface {
Object proceed3(Chain chain) throws InterruptedException;
}
}
public class PointInterface1 implements Chain.PointInterface {
@Override
public Object proceed3(Chain chain) throws InterruptedException {
System.out.println("point 1 before");
Thread.sleep(20);
Object result = chain.proceed2();
Thread.sleep(20);
System.out.println("point 1 after");
return result;
}
}
public class PointInterface2 implements Chain.PointInterface {
@Override
public Object proceed3(Chain chain) throws InterruptedException {
System.out.println("point 2 before");
Thread.sleep(20);
Object result = chain.proceed2();
Thread.sleep(20);
System.out.println("point 2 after");
return result;
}
}

结果:

---12->进入了 获取代理对象的方法: getProxy(Object origin)
---12.1->进入了 SpringCglibProxyInterceptor构造方法中的对象参数Chain的构造方法
---13->进入了 SpringCglibProxyInterceptor的构造方法
---14->进入了 SpringCglibProxyInterceptor.class中 基层CglibPoxy接口的实现方法
---15->进入了 基层CglibPoxy接口的实现方法 调用的proceed2()方法
point 1 before
---49->干正事-before-(proceed2()方法中)做的事情--X: 0--start
---15->进入了 基层CglibPoxy接口的实现方法 调用的proceed2()方法
point 2 before
---49->干正事-before-(proceed2()方法中)做的事情--X: 1--start
---50->干正事-ing-(proceed2()方法中)Target Method invoke result : hello cglib !
---51->总结:1.切面一次性处理<正事>之前的琐事-->2.干正事-->3.切面一次性处理<正事>之后的琐事
---15->进入了 基层CglibPoxy接口的实现方法 调用的proceed2()方法
point 2 after
---49->干正事-before-(proceed2()方法中)做的事情--X: 2--end
point 1 after
---49->干正事-before-(proceed2()方法中)做的事情--X: 2--end

cglib 多重 代理示例-2的更多相关文章

  1. cglib 简单 代理示例-1

    引用包cglib-xxx.jar非Maven项目还需要手动引用包asm-xxx.jar业务类(不需要定义接口)cglib代理类(实现接口MethodInterceptor) 异常信息(项目只引用了cg ...

  2. 使用 Cglib 实现多重代理

    前言 由于 Cglib 本身的设计,无法实现在 Proxy 外面再包装一层 Proxy(JDK Proxy 可以),通常会报如下错误: Caused by: java.lang.ClassFormat ...

  3. cglib代理与jdk动态代理示例

    先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...

  4. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  5. cglib源码分析(四):cglib 动态代理原理分析

    本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...

  6. Spring源码剖析5:JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

  7. cglib动态代理代码示例

    cglib动态代理代码示例 引用包cglib-xxx.jar 非Maven项目还需要手动引用包asm-xxx.jar 业务类(不需要定义接口) cglib代理类(实现接口MethodIntercept ...

  8. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

  9. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

随机推荐

  1. 12月8日 周五 image_tag.

    Overview of helpers provided by Action View 6.1 AssetTagHelper:用于generate html语言 image_tag ,return a ...

  2. mysql--------四种索引类型

    一.索引的类型 mysql索引的四种类型:主键索引.唯一索引.普通索引和全文索引.通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力.索引优化时mysql中的一种优化方式.索引的作 ...

  3. UVA557 汉堡 Burger

    题面 https://www.luogu.org/problemnew/show/UVA557 这里顺便整理一下二维格点随机游走问题. 遇到这种问题时,需注意分母的计算问题. 设x为起点到终点的距离. ...

  4. WaitForMultipleObjects用法详解

    本文转载于:http://blog.csdn.net/sac761/article/details/52456385 WaitForMultipleObjects是Windows中的一个功能非常强大的 ...

  5. hihoCoder-1087 Hamiltonian Cycle (记忆化搜索)

    描述 Given a directed graph containing n vertice (numbered from 1 to n) and m edges. Can you tell us h ...

  6. 3n+1问题中的几个小的注意点

    3038 3n+1问题  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 3n+1问题是一个简单有趣而又没有 ...

  7. 30. Substring with Concatenation of All Words *HARD*

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  8. javascript primise本质——为了简化异步编码而针对异步操作的代理

    概述 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 语法 new Promise(executor); new Promise(functio ...

  9. SQL基础用法(实例一)

    /* 2006年10月01日 SQL Server 数据库的基本操作 (1) 数据库的创建 (2) 数据表的创建以及相关约束的指定(含临时表) (3) 数据的添/删/改 (4) 数据的查询 */ () ...

  10. vs2015如何设置类或函数前不显示引用的数量

    这几天,从vs2012换成vs2015,感觉15版本增加了一个类或函数前提示引用的数量,这个感觉很别扭,如何取消显示这个呢? 问题如下: 取消显示这个引用的步骤: 找到菜单栏: 工具 ---> ...