概念
AOP:AOP是 OOP(面向对象编程)的一种延续,OOP中继承的思想主要是提高代码的重用率,但是继承不能同个类在多个方法的相同位置出现的相同代码的问题
JDK动态代理:AOP的一种实现,仅支持实现了接口的类。性能较好
Cglib:AOP的一种实现,支持实现了接口的类和没有实现接口的类。对比JDK动态代理性能较差
Spring AOP:结合上面2种方式,spring会自动在JDK动态代理和CGLIB之间转换,优先使用JDK(类实现了接口的时候)
AspectJ:只是一个框架,提供更便捷的语法帮我们更好的使用AOP
JDK与Cglib 使用
先建立 2个类,一个没有实现接口,一个是实现了接口的
1public class UserUtil { 2 public void addUser(String id, String password) { 3 System.out.println("UserUtil.addUser() ..."); 4 } 5}
1public interface UseService { 2 void addUser(String id, String password); 3} 4 5 6public class UseServiceImpl implements UseService { 7 @Override 8 public void addUser(String id, String password) { 9 System.out.println("UseServiceImpl.addUser() ..."); 10 } 11}
JDK 动态代理
1/** 2 * JDK动态代理类 3 */ 4public class JDKProxy implements InvocationHandler { 5 6 private Object targetObject; 7 8 public Object newProxy(Object targetObject) { 9 this.targetObject = targetObject; 10 return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); 11 } 12 13 @Override 14 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 15 System.out.println("前置..."); 16 return method.invoke(targetObject, args); 17 } 18 19}
Cglib
1/** 2 * CGlib动态代理类 3 */ 4 public class CGLibProxy implements MethodInterceptor { 5 6 private Object targetObject; 7 8 public Object createProxyObject(Object obj) { 9 this.targetObject = obj; 10 Enhancer enhancer = new Enhancer(); 11 enhancer.setSuperclass(obj.getClass()); 12 enhancer.setCallback(this); 13 return enhancer.create(); 14 } 15 16 @Override 17 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { 18 System.out.println("前置..."); 19 return method.invoke(targetObject, args); 20 } 21}
测试
1public class ProxyTest { 2 3 public static void main(String[] args) { 4 //cglib 代理:支持没有实现接口的类和实现了接口的类 5 UserUtil userManager = (UserUtil) new CGLibProxy().createProxyObject(new UserUtil()); 6 userManager.addUser("tom", "root"); 7 8 //jdk 动态代理:支持实现了接口的类 9 UseService useServiceJDK = (UseService) new JDKProxy().newProxy(new UseServiceImpl()); 10 useServiceJDK.addUser("tom", "root"); 11 } 12}