jdk代理和cglib代理
jdk代理,核心方法为Proxy.newProxyInstance()
public class JdkProxyFactory {
public static T getProxyObject(T targetClass){
return (T) Proxy.newProxyInstance(
targetClass.getClass().getClassLoader(), //第一个参数是类加载器
targetClass.getClass().getInterfaces(), //第二个参数是目标类的接口
(proxy, method, args) -> { //第三个参数是代理实例的调用处理程序实现的接口!其实就是具体实现的方式
MyAspect myAspect = new MyAspect();
myAspect.before();
//这里是调用目标的方法
Object invoke = method.invoke(targetClass, args);
myAspect.after();
return invoke;
});
}
cglib代理,核心方法Enhancer.create()
public class CglibProxyFactory {
public static T getCglibProxy(T targetClass){
Object o = Enhancer.create(
targetClass.getClass(), //第一个参数是获取目标类的class对象
(InvocationHandler) (o1, method, objects) -> { //具体的目标类的调用处理程序的具体实现
MyAspect myAspect = new MyAspect();
myAspect.before(); //前置增强
Object invoke = method.invoke(targetClass, objects);
myAspect.after(); //后置增强
return invoke;
});
return (T) o;
}
}
如何选择,就看目标代理对象是否有对应的接口,如果有对应的接口就选择jdk代理,如果目标类只有实现类,没有对应接口,就使用cgLib代理。
图里面的MyAspect类只是写的一个增强的方法。
public class MyAspect {
public void before(){
System.out.println("方法之前的通知!");
}
public void after(){
System.out.println("方法之后的通知!");
}
}