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);