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. 新概念 Lesson 5 How are you today

    How is Emma? 艾玛身体还好吗? 短语:very well How's Emma? She's very well, too. Emma is very well today   adv. ...

  2. Vue.js教程--基础(实例 模版语法template computed, watch v-if, v-show v-for, 一个组件的v-for.)

    官网:https://cn.vuejs.org/v2/guide/index.html Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统. 视频教程:https: ...

  3. webService开发(JDK版)

    最近做社保查询的东西,然而这个是三个公司一起做的,需要调其他公司的接口,他们公司用了webService这个当年比较流行的技术,于是乎就研究了一下这个webService. HTTP协议 + XML方 ...

  4. 『科学计算』通过代码理解SoftMax多分类

    SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...

  5. codefroces 450B矩阵快速幂

    找出递推关系式就好了 (fi+1)=(1  -1)(fi  ) (    fi)=(1   0)(fi-1) 不会打矩阵将就着看吧... 这是第一道矩阵快速幂.细节还是有很多没注意到的 本来想看挑战写 ...

  6. mysql语句查询时间检测

    explain的使用 1.首先我们是要登入你的mysql的,然后选择数据库输入:use 你要选择的库名 2执行语句 eg:  explain SELECT * FROM wish_orders1412 ...

  7. SQL语句增加列、修改列类型、修改列、删除列

    1.增加列: alter table tableName add columnName varchar(30) 2.修改列类型: alter table tableName alter column ...

  8. Intel DAAL AI加速 ——传统决策树和随机森林

    # file: dt_cls_dense_batch.py #===================================================================== ...

  9. 自定义Spark Partitioner提升es-hadoop Bulk效率——续

    对于es 2.4版本,要能定制spark partitioner需要如下方式启动spark shell: spark-2.0.0-bin-hadoop2.6/bin/spark-shell --jar ...

  10. DeepLearning (三) 预处理:主成分分析与白化

    [原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 PCA算法前面在前面的博客中已经有介绍,这里简单在描述一下,更详细的PCA算法请参考 ...