代理模式三(cglib动态代理)

本文介绍如何使用CGLIB为没有实现接口的类创建动态代理。通过具体案例,展示了CGLIB的工作原理及其实现步骤,包括创建目标类、配置代理工厂类以及测试代码。

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

对于无接口的类,要为其创建动态代理,可以使用 CGLIB 来实现。CGLIB 代理的生成原理是生成目标类的子类,而子类是增强过的,

这个子类对象就是代理对象。所以,使用CGLIB 生成动态代理,要求目标类必须能够被继承,即不能是 final 的类。

还是直接附上案例

首先需要导入 CGLIB 的 Jar 包: cglib-full.jar。

目标类

package com.demo;

public class AccountService {

	public void transfer(){		//主业务逻辑
		System.out.println("调用Dao层,完成转账业务");
	}
	
	public void getBalance(){	//主业务逻辑
		System.out.println("调用Dao层,完成查询余额");
	}
}
Cglig代理工厂类
package com.demo;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class AccountServiceCglibProxyFactory implements MethodInterceptor{

	private AccountService target;	//目标对象
	
	public AccountServiceCglibProxyFactory(AccountService target) {
		this.target = target;
	}
	
	public AccountService createProxy(){	//工厂方法
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(AccountService.class);
		enhancer.setCallback(this);
		return (AccountService) enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] args, 
			MethodProxy methodProxy) throws Throwable {	//回调接口方法
		if("transfer".equals(method.getName())){
			System.out.println("开始时间" + System.currentTimeMillis());
			Object result = method.invoke(target, args);
			System.out.println("结束时间" + System.currentTimeMillis());
			return result;
		}
		return method.invoke(target, args);
	}

}
测试代码
package com.demo;

public class Client {

	public static void main(String[] args) {
		
		AccountService target = new AccountService();	//目标对象
		AccountService proxy = new AccountServiceCglibProxyFactory(target).createProxy();//代理对象
		proxy.transfer();
		proxy.getBalance();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值