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