spring源码学习之【准备】jdk动态代理例子

一:被代理的对象所要实现的接口

 1 package com.yeepay.testpoxy;
 2
 3 import java.util.Map;
 4
 5 /**
 6  * 被动态代理的接口
 7  * @author shangxiaofei
 8  *
 9  */
10 public interface MyCheckPay {
11     /**
12      * 付钱的接口
13      * @param name
14      * @param money
15      * @return
16      */
17     public Map<String, String> payMoney(String name,Integer money);
18 }

View Code

二:被动态代理的实现类

 1 package com.yeepay.testpoxy;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 /**
 7  * 被动态代理的实现类
 8  * @author shangxiaofei
 9  *
10  */
11 public class ShangxiaofeiMyCheckPay implements MyCheckPay{
12
13     @Override
14     public Map<String, String> payMoney(String name, Integer money) {
15         System.out.println("ShangxiaofeiMyCheckPay.payMoney()========>name=["+name+"],payMoney=["+money+"]");
16         Map<String, String> map=new HashMap<String, String>();
17         map.put("result",name+"付钱"+money+"元,已经结束");
18         return map;
19     }
20
21
22
23 }

View Code

三:动态代理的增强类(代理类)

 1 package com.yeepay.testpoxy;
 2
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5
 6 /**
 7  * 增加功能的类
 8  * @author shangxiaofei
 9  *
10  */
11 public class HandlerForMyCheckPay implements InvocationHandler{
12     /**
13      * 被委托的类的引用
14      */
15     private Object object;
16
17
18
19     /**
20      * 空构造
21      */
22     public HandlerForMyCheckPay() {
23
24     }
25
26
27
28     /**
29      * 有参构造
30      * @param object
31      */
32     public HandlerForMyCheckPay(Object object) {
33         this.object = object;
34     }
35
36
37
38
39     /**
40      * Object proxy:指代我们所代理的那个真实对象,这个对象不能使用,否则会引起栈溢出
41      * Method method: 指代的是我们所要调用真实对象的某个方法的Method对象
42      * Object[] args: 指代的是调用真实对象某个方法时接受的参数
43      */
44     @Override
45     public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
46
47         /**
48          * 被代理对象调用方法之前调用(aop的前置增强)
49          */
50         System.out.println("HandlerForMyCheckPay.invoke()=======>【付钱前】向统计系统发送付钱消息");
51         if(args!=null&&args.length>0){
52             for(int i=0;i<args.length;i++){
53                 System.out.println("HandlerForMyCheckPay.invoke()发送消息为===>"+args[i]);
54             }
55         }
56
57
58         /**
59          * 调用被代理对象的实际的方法
60          */
61         Object d=method.invoke(this.object, args);
62
63
64         /**
65          * 调用被代理对象的实际的方法之后执行:后置增强
66          */
67         System.out.println("HandlerForMyCheckPay.invoke()=======>【付钱后】进行计算执行时长");
68
69         return d;
70     }
71
72
73
74 }

View Code

四:代理类的生产工厂

 1 package com.yeepay.testpoxy;
 2
 3 import java.lang.reflect.Proxy;
 4
 5 /**
 6  * 生产代理者的工厂类
 7  * @author shangxiaofei
 8  *
 9  */
10 public class ProxyFactory {
11
12     public static MyCheckPay getMyCheckPay(){
13
14         /**
15          * ClassLoader loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
16          * Class<?>[] interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
17          * InvocationHandler h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
18          */
19         Object object=Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), new Class[]{MyCheckPay.class},new HandlerForMyCheckPay(new ShangxiaofeiMyCheckPay()));
20         return (MyCheckPay) object;
21     }
22
23
24     public static MyCheckPay getMyCheckPay2(){
25
26         /**
27          * ClassLoader loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
28          * Class<?>[] interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
29          * InvocationHandler h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
30          */
31         Object object=Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(),MyCheckPay.class.getInterfaces(),new HandlerForMyCheckPay(new ShangxiaofeiMyCheckPay()));
32         return (MyCheckPay) object;
33     }
34 }

View Code

五:测试类

 1 package com.yeepay.testpoxy;
 2
 3 import java.util.Map;
 4
 5 /**
 6  * 测试动态代理
 7  * @author shangxiaofei
 8  *
 9  */
10 public class TestController {
11
12     private MyCheckPay myCheckPay=ProxyFactory.getMyCheckPay();
13
14     public void payMoney(String name,Integer money){
15         System.out.println("TestController.payMoney(开始)");
16         Map<String, String> map=myCheckPay.payMoney(name, money);
17         System.out.println("TestController.payMoney(结束)"+map.get("result"));
18     }
19
20     /**
21      * TestController.payMoney(开始)
22      *HandlerForMyCheckPay.invoke()=======>【付钱前】向统计系统发送付钱消息
23      *HandlerForMyCheckPay.invoke()发送消息为===>怪物雷克
24      *HandlerForMyCheckPay.invoke()发送消息为===>100
25      *ShangxiaofeiMyCheckPay.payMoney()========>name=[怪物雷克],payMoney=[100]
26      *HandlerForMyCheckPay.invoke()=======>【付钱后】进行计算执行时长
27      *TestController.payMoney(结束)怪物雷克付钱100元,已经结束
28      * @param args
29      */
30     public static void main(String[] args) {
31         TestController testController=new TestController();
32         testController.payMoney("怪物雷克", 100);
33     }
34
35 }

View Code

 

时间: 2024-10-25 06:46:34

spring源码学习之【准备】jdk动态代理例子的相关文章

spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能

一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了.--->JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理. 性能:--->jdk的动态代理由于jdk版本的升级,渐渐超越cglib  二:都说 Cglib 创建的动态代理

【spring源码学习】spring的AOP面向切面编程的实现解析

一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口  =>org.springframework.aop.BeforeAdvice   org.springframework.aop.MethodBeforeAdvice  =>org.springframework.aop.AfterAdvice   org.springframework.aop.After

Spring源码学习之:FactoryBean的使用

转载:http://book.51cto.com/art/201311/419081.htm ==========个人理解========================= FactoryBean和BeanFactory的关系[1]FactoryBean:是一个接口,是一个用户自定义实现类实现该接口的A类.当ioc容器初始化完成后.BeanFactory(ioc容器)调用getBean("beanname")的时候,返回的bean不是A类对应的实例,而是A类getObject()方法返

【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案

转载:http://www.iteye.com/topic/1122740 1.预备知识 aop概念请参考[http://www.iteye.com/topic/1122401]和[http://jinnianshilongnian.iteye.com/blog/1418596] spring的事务管理,请参考[http://jinnianshilongnian.iteye.com/blog/1441271] 使用AOP 代理后的方法调用执行流程,如图所示 也就是说我们首先调用的是AOP代理对象

spring源码学习之:springAOP实现底层原理

一:springAOP底层实现是基于动态代理实现的.增强和切面,以及通知.是在动态代理生成的代理类inoke方法中调用实现 1 //+++++++++++++aop动态代理+++++++++++++++++++++++ 2 3 4 /** 5 * 通知,表示增强.在某些方法调用前,调用后,抛出异常后,对方法的增强.(是一个具体实现类,类中的方法实现了增强) 6 */ 7 //方法执行前通知 8 BeforeAdvice beforeAdvice ; 9 MethodBeforeAdvice Me

【spring源码学习】spring的事务管理的源码解析

[一]spring事务管理(1)spring的事务管理,是基于aop动态代理实现的.对目标对象生成代理对象,加入事务管理的核心拦截器==>org.springframework.transaction.interceptor.TransactionInterceptor.===>spring事务管理的核心拦截器===>需要配置的数据项:事务管理机制配置属性的查找类transactionAttributeSource,事务管理的核心处理器PlatformTransactionManager

spring源码学习之:spring容器的applicationContext启动过程

 Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机,而ApplicationContext则是 整辆汽车,它不但包括发动机,还包括离合器.变速器以及底盘.车身.电气设备等其他组件.在ApplicationContext内,各个组件按部就班. 有条不紊地完成汽车的各项功能. ApplicationContext内部封装 了一个BeanFactory对

【spring源码学习】spring的事件发布监听机制源码解析

[一]相关源代码类 (1)spring的事件发布监听机制的核心管理类:org.springframework.context.event.SimpleApplicationEventMulticaster. =>该类的初始化是放在项目加载时,在ioc容器xml配置文件解析加载完毕后,注册bean创建前后置处理实现类(BeanPostProcessor 接口实现),beanFactory配置处理(BeanFactoryPostProcessor接口实现)后,初始化该事件发布监听机制的核心类. pu

【spring源码学习】spring的IOC容器在初始化bean过程

[一]初始化IOC的bean的时候Spring会执行的一些回调方法 (1)spring bean创建的前置处理 =>ApplicationContextAwareProcessor 在创建bean的时候调用 bean.setEnvironment(this.applicationContext.getEnvironment()) bean.setEmbeddedValueResolver(new EmbeddedValueResolver(this.applicationContext.getB