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)

spring aop原理 JDK动态代理和CGLIB动态代理

SPRING03_AOP的概述动态代理cglib代理相关概念基于xml配置基于注解配置

Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理?