• Spring——AOP(动态代理)


    以例子说明:

    一、创建两个接口,并创建各自的实现类,实现类在XML文件中进行配置,并在测试类中取得各实现类的实例

    二、创建代理类,实现InvocationHandler接口

    (1)声明实际代理的对象

    1 private Object obj;

     (2)创建绑定的方法,通过传入的实际代理对象创建对应的代理对象

     1 /**
     2      * @param obj
     3      * @return 代理对象
     4      */
     5     public Object bind(Object obj)
     6     {
     7         this.obj = obj;
     8         /*
     9          *  代理对象
    10          *  loader - 定义代理类的类加载器
    11             interfaces - 代理类要实现的接口列表
    12             h - 指派方法调用的调用处理程序 
    13 
    14          */
    15         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    16     }

    (3)定义代理类需要添加的功能(如日志记录)

    1 //日志记录
    2     private Logger logger = Logger.getLogger(this.getClass().getName());

    (4)重写invoke方法,当代理对象执行任意实际对象中的方法时,都会进行拦截,从而可执行用户自定义增加的操作(如AOP)

     1 @Override
     2     /**
     3      * 当代理对象,调用任意方法时,该方法进行拦截
     4      * proxy:代理对象
     5      * method:调用的方法
     6      * args:调用方法传入的参数
     7      */
     8     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     9         
    10         System.out.println("实际对象:" + this.obj);
    11         System.out.println("调用方法:" + method);
    12         System.out.println("调用方法传入参数:" + args);
    13         
    14         logger.log(Level.INFO, "【" + new Date().toLocaleString() +"】调用方法开始:" + this.obj.getClass().getName()+"."+method.getName()+"("+Arrays.toString(args)+")");
    15         
    16         //调用方法
    17         Object result = method.invoke(this.obj, args);
    18         
    19         logger.log(Level.INFO, "【" + new Date().toLocaleString() +"】调用方法结束:" + result);
    20         
    21         return result;
    22     }

    三、在测试类中通过传入实际代理的对象,创建出代理对象,并执行相应的方法

     1 //有代理
     2         ProxyHandler proxyHandler = new ProxyHandler();
     3         //代理对象  代理的实际对象userDao
     4         IUserDao userDaoProxy = (IUserDao)proxyHandler.bind(userDao);
     5         //userDaoProxy.updateUser();
     6         
     7         //代理对象 代理的实际对象deptDao
     8         IDeptDao deptDaoProxy = (IDeptDao)proxyHandler.bind(deptDao);
     9         //deptDaoProxy.updateDept();
    10         String result = deptDaoProxy.insertDept("软件开发事业部");
    11         System.out.println("新增结果:" + result);
  • 相关阅读:
    T4 assembly
    HtmlPrefixScopeExtensions
    PetaPoco修改
    类属性赋值
    Microsoft Office 2007的ContentType
    年月日-正则
    Unity shader学习之逐顶点漫反射光照模型
    Unity3d之表情动画--眨眼
    shader之法线变换
    Unity之fragment shader中如何获得视口空间中的坐标
  • 原文地址:https://www.cnblogs.com/ccw95/p/6128103.html
Copyright © 2020-2023  润新知