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

     

  • 相关阅读:
    c#中的对象生命周期
    数据抓取的艺术(三):抓取Google数据之心得
    redmine3.3.0安装问题
    wget 无法建立ssl连接 [ERROR: certificate common name ?..ssl.fastly.net?.doesn?. match requested host name ?.ache.ruby-lang.org?. To connect to cache.ruby-lang.org insecurely, use ?.-no-check-certificate?]
    Centos安装ruby
    Redmine插件的安装与卸载,知识库插件安装。
    Nexus网页直接上传jar包
    mvn deploy命令上传包
    一辈子只有1次成为BAT的机会,你如何把握?
    redmine创建新闻,自动发邮件给项目组所有成员
  • 原文地址:https://www.cnblogs.com/hongten/p/spring_aop_proxy.html
Copyright © 2020-2023  润新知