spring源码学习之【准备】jdk动态代理例子
一:被代理的对象所要实现的接口
package com.yeepay.testpoxy; import java.util.Map; /**
* 被动态代理的接口
* @author shangxiaofei
*
*/
public interface MyCheckPay {
/**
* 付钱的接口
* @param name
* @param money
* @return
*/
public Map<String, String> payMoney(String name,Integer money);
}
二:被动态代理的实现类
package com.yeepay.testpoxy; import java.util.HashMap;
import java.util.Map; /**
* 被动态代理的实现类
* @author shangxiaofei
*
*/
public class ShangxiaofeiMyCheckPay implements MyCheckPay{ @Override
public Map<String, String> payMoney(String name, Integer money) {
System.out.println("ShangxiaofeiMyCheckPay.payMoney()========>name=["+name+"],payMoney=["+money+"]");
Map<String, String> map=new HashMap<String, String>();
map.put("result",name+"付钱"+money+"元,已经结束");
return map;
} }
三:动态代理的增强类(代理类)
package com.yeepay.testpoxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* 增加功能的类
* @author shangxiaofei
*
*/
public class HandlerForMyCheckPay implements InvocationHandler{
/**
* 被委托的类的引用
*/
private Object object; /**
* 空构造
*/
public HandlerForMyCheckPay() { } /**
* 有参构造
* @param object
*/
public HandlerForMyCheckPay(Object object) {
this.object = object;
} /**
* Object proxy:指代我们所代理的那个真实对象,这个对象不能使用,否则会引起栈溢出
* Method method: 指代的是我们所要调用真实对象的某个方法的Method对象
* Object[] args: 指代的是调用真实对象某个方法时接受的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { /**
* 被代理对象调用方法之前调用(aop的前置增强)
*/
System.out.println("HandlerForMyCheckPay.invoke()=======>【付钱前】向统计系统发送付钱消息");
if(args!=null&&args.length>0){
for(int i=0;i<args.length;i++){
System.out.println("HandlerForMyCheckPay.invoke()发送消息为===>"+args[i]);
}
} /**
* 调用被代理对象的实际的方法
*/
Object d=method.invoke(this.object, args); /**
* 调用被代理对象的实际的方法之后执行:后置增强
*/
System.out.println("HandlerForMyCheckPay.invoke()=======>【付钱后】进行计算执行时长"); return d;
} }
四:代理类的生产工厂
package com.yeepay.testpoxy; import java.lang.reflect.Proxy; /**
* 生产代理者的工厂类
* @author shangxiaofei
*
*/
public class ProxyFactory { public static MyCheckPay getMyCheckPay(){ /**
* ClassLoader loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
* Class<?>[] interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
* InvocationHandler h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
*/
Object object=Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), new Class[]{MyCheckPay.class},new HandlerForMyCheckPay(new ShangxiaofeiMyCheckPay()));
return (MyCheckPay) object;
} public static MyCheckPay getMyCheckPay2(){ /**
* ClassLoader loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
* Class<?>[] interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
* InvocationHandler h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
*/
Object object=Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(),MyCheckPay.class.getInterfaces(),new HandlerForMyCheckPay(new ShangxiaofeiMyCheckPay()));
return (MyCheckPay) object;
}
}
五:测试类
package com.yeepay.testpoxy; import java.util.Map; /**
* 测试动态代理
* @author shangxiaofei
*
*/
public class TestController { private MyCheckPay myCheckPay=ProxyFactory.getMyCheckPay(); public void payMoney(String name,Integer money){
System.out.println("TestController.payMoney(开始)");
Map<String, String> map=myCheckPay.payMoney(name, money);
System.out.println("TestController.payMoney(结束)"+map.get("result"));
} /**
* TestController.payMoney(开始)
*HandlerForMyCheckPay.invoke()=======>【付钱前】向统计系统发送付钱消息
*HandlerForMyCheckPay.invoke()发送消息为===>怪物雷克
*HandlerForMyCheckPay.invoke()发送消息为===>100
*ShangxiaofeiMyCheckPay.payMoney()========>name=[怪物雷克],payMoney=[100]
*HandlerForMyCheckPay.invoke()=======>【付钱后】进行计算执行时长
*TestController.payMoney(结束)怪物雷克付钱100元,已经结束
* @param args
*/
public static void main(String[] args) {
TestController testController=new TestController();
testController.payMoney("怪物雷克", 100);
} }
spring源码学习之【准备】jdk动态代理例子的更多相关文章
- Spring AOP高级——源码实现(1)动态代理技术
在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理. 动态代理实际上也是一种结构型的设计模式,JDK中已经为我们准备好了这种设计模式,不过这种JDK ...
- 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 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- spring源码学习之路---IOC初探(二)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
随机推荐
- [网络技术][转]PPTP连接过程
转自:http://blog.csdn.net/zhu_hit/article/details/5698958 在未来几天会总结一下PPTP的工作过程,分为以下3篇讲述. 1. PPTP连接过程: 2 ...
- [Windows驱动]驱动包(Driver Packages)
在windows下安装一个驱动,我们你需要把所有需要的软件打包-称为驱动包.驱动包里包括系统提供的给所有设备类使用的一般安装工具,还包括了设备商提供的设备特定的组件.下面我们就来看看驱动包里具体需要哪 ...
- SharePoint 2013 开发——开发自定义操作APP
博客地址:http://blog.csdn.net/FoxDave 自定义操作即我们所说的Ribbon和ECB(Edit Control Block),在SharePoint 2013之前,我们可以 ...
- Centos使用key登录验证
1. 新建用户lsyw 设置密码 #useradd lsyw #passwd lsyw 2. 测试新建用户可以登录 3. 修改root登录密码为通用root密码,测试用新密码登录是否成功 0!B2pj ...
- ArrayList的使用方法【转载】
*** Source URL: http://i.yesky.com/bbs/jsp/view.jsp?articleID=889992&forumID=150 *** 1.什么是ArrayL ...
- 自适应label的高度
iOS7以下的系统可使用方法 //获得当前cell高度 CGRect frame = [self frame]; //文本赋值 self.introduction.text = text; //设置l ...
- hdu 2057
PS:一开始我画蛇添足的用字符串来做....超麻烦...贴个我做的.. 代码: #include "stdio.h" #include "string.h" ...
- hdu 2029
PS: 逻辑问题... 代码: #include "stdio.h"#include "string.h"int main(){ char a[110]; i ...
- C语言快速排序
复习快速排序,用C语言实现: #include <stdio.h> int quicksort(int begin, int end, int a[], int len); void ma ...
- eclipse安装hibernate