spring源码学习之【准备】cglib动态代理例子
一:委托者
package com.yeepay.porxy.cglib.test; import java.util.HashMap;
import java.util.Map; /**
* 目标类,(委托类)
* @author shangxiaofei
*
*/
public class PaymentServer { public Map<String, String> payMoney(String name,Integer money){
System.out.println("paymentServer.payMoney()付钱=========>名字【"+name+"】,money=【"+money+"】");
Map<String, String> map=new HashMap<String, String>();
map.put("result", "已经完成付钱");
return map;
}
}
二:增强者(代理类)
package com.yeepay.porxy.cglib.test; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 增强类
* @author shangxiaofei
*
*/
public class PoxyForService implements MethodInterceptor{ @Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,MethodProxy arg3) throws Throwable {
// 增强功能的代码
System.out.println("PoxyForService.intercept(方法执行前执行========>向统计发送消息)");
if(arg2!=null&&arg2.length>0){
for(int i=0;i<arg2.length;i++){
System.out.println("PoxyForService.intercept()发送的参数内容====>"+arg2[i]);
}
} //执行方法内容
Object object=arg3.invokeSuper(arg0, arg2); System.out.println("PoxyForService.intercept(方法执行后执行=======>计算时间)");
return object;
} }
三:创造代理的工厂类
package com.yeepay.porxy.cglib.test; import net.sf.cglib.proxy.Enhancer; /**
* 代理实现工厂类
* @author shangxiaofei
*
*/
public class PoxyFactory {
public static PaymentServer getPaymentServer(){
// Cglib 核心类,生成代理对象
Enhancer enhancer= new Enhancer();
// 为核心类对象中放入需要代理的委托类的类对象
enhancer.setSuperclass(PaymentServer.class);
// 为核心类对象中放入增强功能的类对象
enhancer.setCallback(new PoxyForService());
// 从核心类对象中获取委托类的代理对象
Object object=enhancer.create(); return (PaymentServer) object;
}
}
四:测试类
package com.yeepay.porxy.cglib.test; import java.util.Map;
/**
* 测试类
* @author shangxiaofei
*
*/
public class TestController { private PaymentServer paymentServer=PoxyFactory.getPaymentServer(); public void payment(){
System.out.println("TestController.payment()开始");
Map<String, String> map=paymentServer.payMoney("怪物雷克", 100);
System.out.println("TestController.payment()结束===>"+map.get("result"));
} /**
* TestController.payment()开始
* PoxyForService.intercept(方法执行前执行========>向统计发送消息)
* PoxyForService.intercept()发送的参数内容====>怪物雷克
* PoxyForService.intercept()发送的参数内容====>100
* paymentServer.payMoney()付钱=========>名字【怪物雷克】,money=【100】
* PoxyForService.intercept(方法执行后执行=======>计算时间)
* TestController.payment()结束===>已经完成付钱
* @param args
*/
public static void main(String[] args) {
TestController testController=new TestController();
testController.payment();
}
}
spring源码学习之【准备】cglib动态代理例子的更多相关文章
- spring源码学习之路---深入AOP(终)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...
- Spring 源码学习——Aop
Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- Spring AOP高级——源码实现(1)动态代理技术
在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理. 动态代理实际上也是一种结构型的设计模式,JDK中已经为我们准备好了这种设计模式,不过这种JDK ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- spring源码学习之路---IOC初探(二)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
随机推荐
- for循环和while循环的区别
public class Xunhuanqubie { public static void main(String[] args){ int i = 0; while(i<8){ System ...
- 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral
项目打开 提示 如题错误. 最近用VS2010 + .NET Framework3.5SP1开发程序,使用了MsChart,但是部署到服务器的时候提示如下错误: 分析器错误消息: 未能加载文件或程序集 ...
- 使用goldengate交付指定时间前的数据
在数据同步过程中,客户担心在源端误操作,比如truncate, drop, delete all等,在目标端也会立即同步,而无法挽救损失:因此,客户希望是目标端的数据比源端要慢一个时间点. 解决方案: ...
- joinfetch之意义
既然被join的对象早晚都要用到,为什么要先从A表取这边的独享,再根据关联关系取B表中的对象,分两次或者多次进行,增加数据库的负载呢? 为什么不把A表和B表join成一张表,从这个组合表中把要取的对象 ...
- 2013年7月份第3周51Aspx源码发布详情
批量重命名文件工具源码 2013-7-19 [VS2010]功能介绍:这是一个新型的文件重命名,主要用了TreeView(树形视图)来选择文件夹,批量进行文件重命名.其中,有"编号在前,编 ...
- 关押罪犯(noip2010)
解法: (1)搜索(30分) (2)二分(此题属于最大值最小问题) (3)贪心+并查集 下面着重说一下“贪心+并查集” 因为有A.B两座监狱,每个犯人不是在A,就是在B监狱. 至于每个犯人在那个监狱, ...
- hdu4417 划分树+二分
//Accepted 14796 KB 453 ms //划分树 //把查询的次数m打成n,也是醉了一晚上!!! //二分l--r区间第k大的数和h比较 #include <cstdio> ...
- JS 基础事件的用法
// 1.9以上用on // 案例一 // $('#btn').on('click', function(){ // //console.log(1); // alert('测试...'); // } ...
- NOIP2010 关押罪犯 (并查集)
若x,y有关系 将x与y的补集, y与x的补集建立关系 ; maxm=; ..maxm,..] of longint; f:..maxn*] of longint; i,j,m,n,x,y,z:lon ...
- 【Sublime Text 3】插件
TrailingSpacer 高亮显示多余的空格和Tab HTML-CSS-JS Prettify