码迷,mamicode.com
首页 > 编程语言 > 详细

spring动态代理

时间:2018-08-25 20:08:51      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:object   string   第一个   ati   实例   类加载器   sys   upd   final   

技术分享图片

 

1、被代理类接口Person.java

 1 package com.xiaostudy;
 2 
 3 /**
 4  * @desc 被代理类接口
 5  * 
 6  * @author xiaostudy
 7  *
 8  */
 9 public interface Person {
10 
11     public void add();
12     public void update();
13     public void delete();
14 }

2、被代理类PersonImple.java

 1 package com.xiaostudy;
 2 
 3 /**
 4  * @desc 被代理类
 5  * 
 6  * @author xiaostudy
 7  *
 8  */
 9 public class PersonImple implements Person {
10 
11     /**
12      * @desc 实现接口方法
13      */
14     public void add() {
15         System.out.println("add()>>>>>>>>");
16     }
17 
18     @Override
19     public void update() {
20         System.out.println("update()>>>>>>>>");
21     }
22 
23     @Override
24     public void delete() {
25         System.out.println("delete()>>>>>>>>");
26     }
27     
28 }

3、切面类MyAdvice.java,就是代理的内容

 1 package com.xiaostudy;
 2 
 3 /**
 4  * @desc 切面类
 5  * 
 6  * @author xiaostudy
 7  *
 8  */
 9 public class MyAdvice {
10     
11     /**
12      * @desc 植入代理方法的方法
13      */
14     public void before() {
15         System.out.println("日记开始>>>>>>>>>>>");
16     }
17     
18     public void after() {
19         System.out.println("日记结束<<<<<<<<<<<<");
20     }
21 
22 }

4、代理工厂类MyBeanFactory.java

 

 1 package com.xiaostudy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6 
 7 /**
 8  * @desc 代理工厂类
 9  * 
10  * @author xiaostudy
11  *
12  */
13 public class MyBeanFactory {
14     /**
15      * @desc 获取一个代理的对象
16      * 
17      * @return Person对象
18      */
19     public static Person createPerson() {
20         //被代理类
21         final Person person = new PersonImple();
22         //切面类
23         final MyAdvice myAdvice = new MyAdvice();
24         /*
25          * 1、第一个参数:loader 类加载器,动态代理类,运行时创建,任何类都需要加载器将其加载到内存
26          * 一般情况:当前类.class.getClassLoader() 2、第二个参数:Class[] interfaces,代理类需要实现的所有接口
27          * 方法1、被代理类实例.getClass().getInterfaces() 注意:只能获取父类的接口,而不能获取父类的父类接口 方法2、new
28          * Class[]{被代理类.class} 3、第三个参数:InvocationHandler 处理类,这个是接口,要进行实现类,采用匿名内部类
29          * 提供invoke()方法,代理类每个方法都要调用一次invoke 3.1、第一个参数:proxy 被代理类对象 3.2、第二个参数:method
30          * 代理类对象当前执行的方法的描述对象 执行方法名:method.getName() 执行方法:method.invoke(被代理类对象,实际参数)
31          * 3.3、第三个参数:方法实际参数
32          */
33         return (Person) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(), person.getClass().getInterfaces(),
34                 new InvocationHandler() {
35                     @Override
36                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
37                         myAdvice.before();
38                         method.invoke(person, args);
39                         myAdvice.after();
40                         return proxy;
41                     }
42                 });
43     }
44 
45 }

 

5、测试类Test.java

 1 package com.xiaostudy;
 2 
 3 /**
 4  * @desc 测试类
 5  * 
 6  * @author xiaostudy
 7  *
 8  */
 9 public class Test {
10 
11     public static void main(String[] args) {
12         Person person = MyBeanFactory.createPerson();
13         person.add();
14         person.update();
15         person.delete();
16     }
17 
18 }

 

spring动态代理

标签:object   string   第一个   ati   实例   类加载器   sys   upd   final   

原文地址:https://www.cnblogs.com/xiaostudy/p/9535015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!