CGLIB动态代理、
CGLIB(Code Generation Libarary)是一个高性能开源的代码生成包,采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。
- 1.创建目标类
- 该类不需要实现任何接口。
TsetDao类
package cglib;
public class TestDao {
public void save(){
System.out.println("保存");
}
public void modify(){
System.out.println("修改");
}
public void delete(){
System.out.println("删除");
}
}
- 2 创建代理类
CglibDynamicProxy类
package cglib;
/*
基于CGLIB动态代理
*/
import aspect.MyAspect;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibDynamicProxy implements MethodInterceptor {
//创建代理方法 生成CGLIB代理对象
//target是目标对象 需要增强的对象
//返回目标对象的CGLIB对象
public Object createProxy(Object target){
//创建一个动态类的对象 即增强类对象
Enhancer enhancer=new Enhancer();
//确定需要增强的类 设置其父类
enhancer.setSuperclass(target.getClass());
//确定代理逻辑对象为当前对象 要求当前对象实现MethodInterceptor的方法
enhancer.setCallback(this);
return enhancer.create();
}
/**
*intercept方法会在程序执行目标方法时被调用
* @param proxy 是CGLIB根据指定父类生成的代理对象
* @param method 是拦截方法
* @param args 是拦截方法的参数数组
* @param methodProxy 是方法的代理对象 用于执行父类的方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
MyAspect myAspect=new MyAspect();
//前增强
myAspect.check();
myAspect.except();
//目标方法执行 返回代理结果
Object obj=methodProxy.invokeSuper(proxy,args);
myAspect.log();
myAspect.monitor();
return obj;
}
}
- 3 创建测试类
在主方法中创建代理对象和目标对象,然后从代理对象中获取对目标对象增强后的对象。
CglibDynamicTest类
package cglib;
public class CglibDynamicTest {
public static void main(String[] args) {
//创建代理对象
CglibDynamicProxy cdp=new CglibDynamicProxy();
//创建目标对象
TestDao testDao=new TestDao();
//获取增强后的目标对象
TestDao testDaoAdvice=(TestDao)cdp.createProxy(testDao);
testDaoAdvice.save();
System.out.println("===============");
testDaoAdvice.modify();
System.out.println("===============");
testDaoAdvice.delete();
}
}
运行结果
`