Spring:AOP-基于cglib的动态代理
cglib是一个第三方框架,专门做代理的。Spring集成了它。
cglib实现代理是**基于“类继承”**的:代理对象是继承目标对象的,是父子关系,子加强了父。
实现步骤:
1、创建目标对象 Target
2、创建增强对象 Advice
3、创建代理对象类 MyProxy
4、编写测试代码
1、创建目标对象 Target
public class Target{
public void save() {
System.out.println("Target: save() running...");
}
}
2、创建增强对象 Advice
public class Advice {
public void before(){
System.out.println("前置增强...");
}
public void afterReturning(){
System.out.println("后置增强...");
}
}
3、创建代理对象类 MyProxy
public class MyProxy {
// 定义目标对象、增强对象
private Target target = new Target();
private Advice advice = new Advice();
public Target getProxy(){
// 创建增强对象
Enhancer enhancer = new Enhancer();
// 给增强对象设置父类
enhancer.setSuperclass(Target.class);
// 设置回调函数
// public void setCallback(Callback callback)
enhancer.setCallback(new MethodInterceptor() {
/**
* SpringMVC中的拦截器:方法拦截器
* @param proxy 代理对象
* @param method 目标方法对象
* @param args 目标方法参数
* @param methodProxy 方法代理
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//前置增强
advice.before();
//反射调用目标方法
Object obj = method.invoke(target, args);
//后置增强
advice.afterReturning();
return obj;
}
});
//创建代理对象
Target proxy = (Target) enhancer.create();
return proxy;
}
}
4、编写测试代码
测试包下写
public class CglibProxyTest {
/**
* 测试基于cglib的动态代理
*/
@Test
public void test01(){
//创建代理对象
Target proxy = new MyProxy().getProxy();
//通过代理对象调用目标方法
proxy.save();
}
}
控制台打印内容:
前置增强...
Target: save() running...
后置增强...