使用CGLIB代理对象的创建

本文介绍了CGLIB库,用于对未实现接口的类创建代理对象。通过生成子类来实现AOP思想,详细步骤包括导入jar包、创建基础类、生成代理对象的类及单元测试。

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

CGLIB简介

CGLIB 用来对没有实现接口的类,实现代理对象的创建,原理是 生成一个子类继承这个类,这个子类就是代理对象,在这个子类中实现AOP的思想

CGLIB的使用

1. 导入jar包

这个包已经集成到spring的核心包中,只要导入spring的 spring-core-4.1.1.RELEASE.jar 就行

2. 先创建一个类

package cn.itcast.aop.demo;

public class ProductDao {
	public void add(String str){
		System.out.println("add===="+str);
	}
	public void delete (String str){
		System.out.println("delete==="+str);
	}
}

3. 创建一个生成代理对象的类

package cn.itcast.aop.demo;

import java.lang.reflect.Method;

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


public class CglibProxy implements MethodInterceptor{
	private ProductDao productDao;
	public CglibProxy(ProductDao productDao){
		this.productDao = productDao;
	}
	public ProductDao createProxy(){
		//使用cglib生成代理
		//1.创建核心类
		Enhancer enhancer = new Enhancer();
		//2.为那个类生成代理
		enhancer.setSuperclass(productDao.getClass());
		//3.设置回调,相当于JDK动态代理中的invoke方法
		enhancer.setCallback(this);
		//4.创建代理对象
		return(ProductDao)enhancer.create();
	}
	//
	@Override
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		if("add".equals(method.getName())){
			System.out.println("日志记录=========");
			/**
			 * 可以 使用 method.invoke (productDao,args)
			 * 
			 */
			Object invoke = methodProxy.invokeSuper(proxy, args);
			//调用代理对象的方法,相当也调用父类的方法
			return invoke;
		}
		return methodProxy.invokeSuper(proxy, args);
	}
}

说明:1. 既然要生成一个类的代理对象,那么要将它传入到他的构造函数中吧 
   2. 再写一个方法生成这个类的对象吧,这里需要用到cglib代理的核心类  Enhancer
           3. 使用Enhancer对象设置 代理对象的父类,就是 需要生成代理对象的类(因为代理对象是目标对象的子类,你要告诉它父类是谁啊)
   4.使用Enhancer对象设置回调,相当于JDK动态代理中的invoke方法,这样你要实现MethodInterceptor,并在intercept中完成想要处理的类的方法
   5. 在intercept方法中实现AOP思想,如在调用add方法前,实现日志记录

4.单元测试

package cn.itcast.aop.demo;

import org.junit.Test;

public class DemoE {
	@Test
	public void test(){
		ProductDao productDao = new ProductDao();
		CglibProxy proxy = new CglibProxy(productDao);
		ProductDao product =  proxy.createProxy();
		
		System.out.println("---------使用aop思想处理的add方法-------");
		product.add("hello!");
		
		System.out.println("--------没有使用aop处理的delete-------");
		
		product.delete("hello!");
	}
}

结果如下:

---------使用aop思想处理的add方法-------
日志记录=========
add====hello!
--------没有使用aop处理的delete-------
delete===hello!
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值