专栏首页Hongtenspring开发_AOP_代理模式

spring开发_AOP_代理模式

项目结构:

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

执行过程:

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

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

 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

 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

 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

 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 }

运行结果;

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()的时候,没有传递任何参数,结果是不会调用任何方法的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring开发_BeanFactoryPostProcessor_容器后处理器

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

    Hongten
  • spring开发_使用p名称空间配置属性

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

    Hongten
  • 看了就知道的工厂模式---java版_源码下载

    =================================================

    Hongten
  • [ASP.NET Core 3框架揭秘] 文件系统[4]:程序集内嵌文件系统

    一个物理文件可以直接作为资源内嵌到编译生成的程序集中。借助于EmbeddedFileProvider,我们可以采用统一的编程方式来读取内嵌的资源文件,该类型定义...

    蒋金楠
  • spring开发_BeanPostProcessor_Bean后处理器

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

    Hongten
  • Java微信公众平台开发_04_自定义菜单

    自定义菜单中请求包的数据是Json字符串格式的,请参见:  Java_数据交换_fastJSON_01_用法入门

    shirayner
  • .net持续集成sonarqube篇之 sonarqube触发webhook

    WebHook近些年来变得越来越流行,github,gitlab等代码托管平台都提供webhook功能.关于webhook这里不做详细介绍,大家可以参阅读相关互...

    Edison.Ma
  • idea中各种for循环的快捷键

    推荐一位有走心的coder,致力于打造一款高质量技术流学习社群,他专注于分享Java技术干货,包括面试攻略,开发技巧,架构设计,职场心得等。

    挨踢小子部落阁
  • 每天一道leetcode160-相交链表

    https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

    乔戈里
  • iOS网络--HTTP请求HTTP请求

    行走少年郎

扫码关注云+社区

领取腾讯云代金券