spring的AOP(三)----Cglib动态代理

本文介绍CGLIB(CodeGenerationLibrary)作为强大的代码生成库,可在运行期扩展Java类与实现接口。通过具体代码示例展示如何使用Cglib创建代理类,并实现对目标对象方法的增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CGLIB(CodeGenerationLibrary)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
如果被代理目标对象,没有实现任何接口,不能用JDK动态代理使,就要选用Cglib 类库进行动态代理。

Cglib 使用原理流程 和 JDK代理 是类似的
其底层依赖一个工具类org.springframework.cglib.proxy.Enhancer和一个接口org.springframework.cglib.proxy.MethodInterceptor
通过对目标对象类创建子类,覆盖方法,实现代理增强

代码示例:
CglibProxyUtils.java

package com.my.cglibproxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

//cglib 创建代理 工具类
public class CglibProxyUtils implements MethodInterceptor{
	
	// 目标对象
	private Object target;
	
	public CglibProxyUtils(Object target) {
		this.target = target;
	}

	// 创建代理
	public Object createProxy(){
		// 创建代理 工具类 
		Enhancer enhancer = new Enhancer();
		// 设置父类型Class 
		enhancer.setSuperclass(target.getClass());
		// 设置回调invocation对象
		enhancer.setCallback(this);
		// 创建代理
		return enhancer.create();
	}

	/*
	 * proxy 是代理对象
	 * method 是调用方法反射对象
	 * args 是调用方法参数
	 * methodProxy 是调用目标方法代理对象 ,用于调用父类的方法
	 * 
	 */
	@Override
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		System.out.println("cglib 动态代理...");
//		return method.invoke(target, args);
		return methodProxy.invokeSuper(proxy, args);// 推荐写法
	}
	
}

ProductDAO.java

package com.my.cglibproxy;

//目标对象
public class ProductDAO {

	public void save(){
		System.out.println("添加商品...");
	}
	
	public void search(){
		System.out.println("搜索商品...");
	}

}

Test.java

package com.my.cglibproxy;


public class Test {
	
	// 没有代理
	@org.junit.Test
	public void demo1(){
		System.out.println("没有代理");
		ProductDAO productDAO = new ProductDAO();
		
		productDAO.save();
		productDAO.search();
		System.out.println("-----------");
		System.out.println();
	}
	
	// 使用cglib代理
	@org.junit.Test
	public void demo2(){
		// 目标
		System.out.println("使用cglib代理");
		ProductDAO productDAO = new ProductDAO();
		// 创建代理
		CglibProxyUtils cglibProxyUtils = new CglibProxyUtils(productDAO);
		ProductDAO proxy = (ProductDAO) cglibProxyUtils.createProxy();
		// 执行方法
		proxy.save();
		proxy.search();
	}
	

}

运行结果:
这里写图片描述

Coding Diary

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值