cglib 多重 代理示例-2
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的更多相关文章
- cglib 简单 代理示例-1
引用包cglib-xxx.jar非Maven项目还需要手动引用包asm-xxx.jar业务类(不需要定义接口)cglib代理类(实现接口MethodInterceptor) 异常信息(项目只引用了cg ...
- 使用 Cglib 实现多重代理
前言 由于 Cglib 本身的设计,无法实现在 Proxy 外面再包装一层 Proxy(JDK Proxy 可以),通常会报如下错误: Caused by: java.lang.ClassFormat ...
- cglib代理与jdk动态代理示例
先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...
- 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...
- cglib源码分析(四):cglib 动态代理原理分析
本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...
- Spring源码剖析5:JDK和cglib动态代理原理详解
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...
- cglib动态代理代码示例
cglib动态代理代码示例 引用包cglib-xxx.jar 非Maven项目还需要手动引用包asm-xxx.jar 业务类(不需要定义接口) cglib代理类(实现接口MethodIntercept ...
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...
- 代理模式 & Java原生动态代理技术 & CGLib动态代理技术
第一部分.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...
随机推荐
- 新概念 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. ...
- 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: ...
- webService开发(JDK版)
最近做社保查询的东西,然而这个是三个公司一起做的,需要调其他公司的接口,他们公司用了webService这个当年比较流行的技术,于是乎就研究了一下这个webService. HTTP协议 + XML方 ...
- 『科学计算』通过代码理解SoftMax多分类
SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...
- codefroces 450B矩阵快速幂
找出递推关系式就好了 (fi+1)=(1 -1)(fi ) ( fi)=(1 0)(fi-1) 不会打矩阵将就着看吧... 这是第一道矩阵快速幂.细节还是有很多没注意到的 本来想看挑战写 ...
- mysql语句查询时间检测
explain的使用 1.首先我们是要登入你的mysql的,然后选择数据库输入:use 你要选择的库名 2执行语句 eg: explain SELECT * FROM wish_orders1412 ...
- SQL语句增加列、修改列类型、修改列、删除列
1.增加列: alter table tableName add columnName varchar(30) 2.修改列类型: alter table tableName alter column ...
- Intel DAAL AI加速 ——传统决策树和随机森林
# file: dt_cls_dense_batch.py #===================================================================== ...
- 自定义Spark Partitioner提升es-hadoop Bulk效率——续
对于es 2.4版本,要能定制spark partitioner需要如下方式启动spark shell: spark-2.0.0-bin-hadoop2.6/bin/spark-shell --jar ...
- DeepLearning (三) 预处理:主成分分析与白化
[原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 PCA算法前面在前面的博客中已经有介绍,这里简单在描述一下,更详细的PCA算法请参考 ...