前言
我们都知道AOP常用的动态代理技术有两种
- 一种是JDK代理:一种基于接口的动态代理技术
- 另一种是cglib代理:基于父类的动态代理技术
- JDK代理需要一个接口才行,而cglib只需要代理对象就行,cglib的底层好像也是调用的JDK的动态代理
现在我们只说一下cglib的动态代理
目标对象
public class Target {
public void method(){
System.out.println("method 执行。。。。。。。。。。。");
}
}
接下来我们要对这个目标代码进行增强
增强类
增强有两种,一种是前置增强,一种是后置增强
package yang.com.proxy;
public class Advice {
public void beforAdvice(){
System.out.println("前置增强方法---------");
}
public void afterAdvice(){
System.out.println("后置增强方法---------");
}
}
测试代码
总共有这么几步
1.实例化目标对象 2.实例化增强对象 3.创建增强器 4.设置父类(目标) 5.设置回调 enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 执行前置增强 method.invoke(target,args); 执行后置增强 return invoke; } }); 6.创建代理对象
public class ProxyTest {
public static void main(final String[] args) {
final Target target =new Target();//目标对象
final Advice advice = new Advice();//增强对象
//返回值 动态代理生成对象 基于cglib
//创建增强器
Enhancer enhancer = new Enhancer();
//设置父类(目标)
enhancer.setSuperclass(Target.class);
//设置回调
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
advice.beforAdvice();//执行前置增强
Object invoke = method.invoke(target,args);
advice.afterAdvice();//执行后置增强
return invoke;
}
});
//创建代理对象
Target proxy =(Target)enhancer.create();
proxy.method();
}
}