AOP的部分原理
静态代理: 定义DAO接口A,类B实现接口A,并重写A的方法method, 代理类C实现接口A,也重写A的方法method, 然后在这个method方法中开启事务,调用B的method方法,关闭事务 好处:在不修改目标对象的功能的前提下,增添新方法 缺点:每个对象都需要有代理对象,导致有很多代理类 接口增加方法,所有的实现类都要改 动态代理:利用jdk中的proxy类,反射(用于有接口的类实现代理) public class ProxyFactory { private Object target; public ProxyFactory(Object target){ this.target = target; } public Object getProxyInstance(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("事务开启"); Object returnValue = method.invoke(target, args); System.out.println("事务关闭"); return returnValue; } }); } } //proxy:指代我们所代理的那个真实对象, //method:指代的是我们所要调用真实对象的某个方法的Method对象 //args:指代的是调用真实对象某个方法时接受的参数 测试: IUserDAO target = new UserDAOImpl(); IUserDAO proxy = (IUserDAO)new ProxyFactory(target).getProxyInstance(); proxy.接口中的方法(); //执行代理对象中的方法,会跳转到InvocationHandler类中的invoke方法 比如,proxy.login(name,password) 即invoke(target, login, name, password),此时return null; cglib:在内存中构建子类对象从而实现对目标对象的功能扩展(用于没有接口的类实现代理) 类似于做拦截,要实现MethodInterpector接口 public class ProxyFactory implements MethodInterceptor{ private Object target; public ProxyFactory(Object target){ this.target = target; } //给目标对象创建代理对象 public Object getProxyInstance(){ Enhancer en = new Enhancer(); //设置父类 en.setSuperclass(target.getClass()); //设置回调函数 en.setCallback(this); //创建子类代理 return en.create(); } @Override public Object intercept(Object obj,Method method,Object[] args MethodProxy proxy) throws Throwable{ System.out.println("开始事务"); Object returnValue = method.invoke(target,args); System.out.println("事务关闭"); return returnValue; } }