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);
原文地址:https://www.cnblogs.com/ccw95/p/6128103.html