Spring AOP:CGLIB动态代理
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP:CGLIB动态代理相关的知识,希望对你有一定的参考价值。
Spring AOP:CGLIB动态代理
JDK动态代理必须提供接口才能使用,对于没有提供接口的类,只能采用CGLIB动态代理。
CGLIB(code generation library)是一个高性能代码开源生成包,采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。
下面介绍一下CGLIB实现动态代理
1-使用eclipse创建一个web应用ch15,并导入相关jar包
2-在ch15的src目录下创建dynamic.cglib包,并在该包中创建目标类TestDao
public class TestDao {
public void save() {
System.out.println("保存") ;
}
public void modify() {
System.out.println("修改") ;
}
public void delete() {
System.out.println("删除") ;
}
}
3-在dynamic.cdlib包中创建代理类CglibDynamicProxy,该类实现MethodInterceptor接口
import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import aspect.MyAspect;
public class CglibDynamicProxy implements MethodInterceptor{
/**
* 创建代理的方法,生产CGLIB代理对象
* target是目标对象,需要增强的对象
* 返回目标对象的CGLIB代理对象
*/
public Object createProxy(Object target) {
//创建一个动态代理类对象,即增强对象
Enhancer enhancer = new Enhancer() ;
//确定需要增强的类,设置其父类
enhancer.setSuperclass(target.getClass());
//确定代理逻辑对象为当前对象
enhancer.setCallback((Callback) this) ;
//返回创建代理的对象
return enhancer.create();
}
/**
*
* @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-在dynamic.cglib包中创建测试类CglibDynamicTest,在主方法中创建代理对象和目标对象,然后从代理对象获取对目标对象增强后的对象,最后调用对象的添加,修改和删除方法。
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() ;
System.out.println("================") ;
}
}
以上是关于Spring AOP:CGLIB动态代理的主要内容,如果未能解决你的问题,请参考以下文章
转载Spring AOP详解 JDK动态代理CGLib动态代理
Spring AOP JDK动态代理与CGLib动态代理区别
spring aop原理 JDK动态代理和CGLIB动态代理