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 ...
随机推荐
- MongoDB数据访问[C#]附源码下载(查询增删改) 转载
安装完MongoDBhttp://localhost:28017/监测是否成功! vs 2008 C# MongoDB 源代码下载地址:http://download.csdn.net/source/ ...
- JS 验证一组input框是否为空的方法
function checkInput() { var $tr = $("#tb_confirmed .scrollContent").find("tr"); ...
- FSMC stm32
1.FSMC机制 FSMC(Flexihie Static Memory Controller,可变静态存储控制器)是STM32系列中内部集成256 KB以上FlaSh,后缀为xC.xD和xE的高存储 ...
- “java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp”
最近在项目中使用hibernate查询时,总报错“java.sql.SQLException: Value '0000-00-00' can not be represented as java.sq ...
- $.noop()和$.map()函数
最近在项目中发现$.noop()函数,因以前没使用过故查询下,现整理如下: jQuery.noop()函数是一个空函数,它什么也不做. 当某些时候你需要传入函数参数,而且希望它什么也不做的时候,你可以 ...
- Python 温习
关于Python内置函数的示例 Type "copyright", "credits" or "license()" f重写or more ...
- BigBlueButton的安装
下来VM文件,打开系统后 sudo apt-get updatesudo apt-get upgradesudo apt-get dist-upgrade sudo apt-get install b ...
- node 学习笔记
以下笔记默认安装完成node 及npm 1.安装express 新版本的express-generator已经独立出来,全局安装这个包就ok. npm install express-generato ...
- C#静态类和静态成员
1. 静态类 1.1 简介 静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数. 静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化. ...
- C++学习笔记12:运算符重载(赋值操作符1)
为数偶类定义专用的赋值操作符 class Couple { public: Couple(, ) :_a(a), _b(b) {} Couple(const Couple &c):_a(c._ ...