前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring开发_AOP_代理模式

spring开发_AOP_代理模式

作者头像
Hongten
发布2018-09-13 16:56:44
2640
发布2018-09-13 16:56:44
举报
文章被收录于专栏:HongtenHongten

项目结构:

http://www.cnblogs.com/hongten/gallery/image/112445.html

执行过程:

用户 -------------- >> 代理对象 -------------->> 目标对象

/AOP/src/com/b510/service/PersonService.java

代码语言:javascript
复制
 1 package com.b510.service;
 2 /**
 3  * 
 4  * @author Hongten
 5  *
 6  */
 7 public interface PersonService {
 8 
 9     /**
10      * 保存方法
11      * 
12      * @param name
13      *            姓名
14 */
15     public void save(String name);
16 
17     /**
18      * 得到person的姓名
19      * 
20      * @param personid
21      *            id号
22      * @return 返回person姓名
23 */
24     public String getPersonName(Integer personid);
25 
26     /**
27      * 更新方法
28      * 
29      * @param name
30      *            person的姓名
31      * @param personid
32      *            person的id号
33 */
34     public void update(String name, Integer personid);
35 }

/AOP/src/com/b510/service/impl/JDKProxyFactory.java

代码语言:javascript
复制
 1 package com.b510.service.impl;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6 
 7 /**
 8  * 当用户要调用目标对象的时候,首先调用的是JDKProxyFactory代理类,代理类会执行invoke方法,在这个调用的过程中,
 9  * 我们在把方法的调用委派给目标对象
10  * 
11  * 
12  * @author Hongten
13  * 
14  */
15 public class JDKProxyFactory implements InvocationHandler {
16 
17     private Object targetObject;
18 
19     public Object createProxyInstance(Object targetObject) {
20         this.targetObject = targetObject;
21         // 参数一:类装载器
22 // 参数二:代理对象要实现的所有接口
23 // 参数三:回调JDKProxyFactory本身实现的接口方法invoke()方法
24         return Proxy.newProxyInstance(this.targetObject.getClass()
25                 .getClassLoader(),
26                 this.targetObject.getClass().getInterfaces(), this);
27     }
28 
29     /**
30      * 实现接口中的方法invoke() 参数一:代理对象 参数二:被拦截到的方法 参数三:方法的输入参数
31      * 
32      * 当执行Proxy.newProxyInstance()的时候,会被newProxyInstance()方法中的第三个参数拦截到,
33      * 进入回调invoke()方法
34      * 
35 */
36     @Override
37     public Object invoke(Object arg0, Method method, Object[] arg)
38             throws Throwable {
39         PersonServiceBean bean = (PersonServiceBean) this.targetObject;
40         Object result = null;
41         //判断bean对象的user属性是否为空,如果为空,则不用把方法委派给目标对象
42         if (bean.getUser() != null) {
43             // 把方法的调用委派给的创建的目标对象
44             result = method.invoke(targetObject, arg);
45         }
46         return result;
47     }
48 
49 }

/AOP/src/com/b510/service/impl/PersonServiceBean.java

代码语言:javascript
复制
 1 package com.b510.service.impl;
 2 
 3 import com.b510.service.PersonService;
 4 
 5 public class PersonServiceBean implements PersonService {
 6 
 7     private String user = null;
 8 
 9     public PersonServiceBean() {
10 
11     }
12 
13     public PersonServiceBean(String user) {
14         this.user = user;
15     }
16 
17     public String getUser() {
18         return this.user;
19     }
20 
21     @Override
22     public String getPersonName(Integer personid) {
23         System.out.println("this is the getPersonName() function");
24         return "hongten";
25     }
26 
27     @Override
28     public void save(String name) {
29         System.out.println("this is the save() function");
30     }
31 
32     @Override
33     public void update(String name, Integer personid) {
34         System.out.println("this is the update() function");
35     }
36 
37 }

/AOP/src/com/b510/test/AOPTest.java

代码语言:javascript
复制
 1 package com.b510.test;
 2 
 3 import com.b510.service.PersonService;
 4 import com.b510.service.impl.JDKProxyFactory;
 5 import com.b510.service.impl.PersonServiceBean;
 6 
 7 public class AOPTest {
 8     public static void main(String[] args) {
 9         JDKProxyFactory factory = new JDKProxyFactory();
10         PersonService service = (PersonService) factory
11                 .createProxyInstance(new PersonServiceBean("hello"));
12         service.save("hongten");
13         service.getPersonName(1);
14         service.update("hello", 2);
15         System.out.println("*************************");
16         PersonService service1 = (PersonService) factory
17                 .createProxyInstance(new PersonServiceBean());
18         service1.save("hongten");
19         service1.getPersonName(1);
20         service1.update("hello", 2);
21         System.out.println("end");
22     }
23 }

运行结果;

代码语言:javascript
复制
1 this is the save() function
2 this is the getPersonName() function
3 this is the update() function
4 *************************
5 end

我们看到的是:new PersonServiceBean("hello")的时候,传递了参数后,即PersonServiceBean中的user属性的值不为空,那么那些方法save(),update(),getPersonName()

就会被调用,而new PersonServiceBean()的时候,没有传递任何参数,结果是不会调用任何方法的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-03-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档