cglib动态代理和jdk动态代理

一、动态代理

说白了就是动态的创建一个类出来,在这个里面引用自己写的类,所有的方法的调用都是先走代理类的对象,它负责做一些代码上的增强,再去调用你写的类。

二、jdk动态代理和cglib动态代理的区别

比如对一批类和他们的方法做了一个切面,定义好了要在这些类的方法里增强的代码,spring必然要对那些类生成动态代理,在动态代理中去执行定义的增强代码;

如果你的类是实现类某个接口的,SpringAOP会使用jdk动态代理,生成一个跟你实现同样接口的一个代理类,构造一个实例对象出来;
如果你的类是没有实现接口,SpringAOP会改用cglib来生成动态代理,生成你的类的一个子类,覆盖你的一些方法,在方法里加入增强的代码;

三、jdk动态代理的代码示例

[引用自]https://www.cnblogs.com/muscleape/p/9018302.html

定义一个ServiceInvocationHandler,持有一个业务接口实现类的对象;
通过getProxy()方法创建一个继承相同接口的动态代理类的实例对象;
当使用动态代理类中的增强方法时,会走到invoke方法中。

/**
 * 业务接口实现类
 * 
 * @author Muscleape
 *
 */
public class UserServiceImpl implements UserService {

	@Override
	public void addUser() {
		System.out.println("增加一个用户。。。");
	}

	@Override
	public void editUser() {
		System.out.println("编辑一个用户。。。");
	}

}

/**
 * 实现InvocationHandler接口的handler代理类
 * 
 * @author Muscleape
 *
 */
public class ServiceInvocationHandler implements InvocationHandler {

	/**
	 * 目标对象
	 */
	private Object target;

	/**
	 * 构造函数
	 * 
	 * @param target
	 */
	public ServiceInvocationHandler(Object target) {
		super();
		this.target = target;
	}

	/**
	 * 实现InvocationHandler接口的方法
	 * 
	 * 执行目标对象的方法,并进行增强
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

		Object result = null;
		System.out.println("代理类方法,进行增强。。。");
		System.out.println("事务开始。。。");
		// 执行目标方法对象
		result = method.invoke(target, args);
		System.out.println("事务结束。。。");
		return result;
	}

	/**
	 * 创建代理实例
	 * 
	 * @return
	 * @throws Throwable
	 */
	public Object getProxy() throws Throwable {
		return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
				this.target.getClass().getInterfaces(), this);
		// 这样写只返回了目标对象,没有生成代理对象
		// return null;
	}

}

四、cglib动态代理的代码示例

[引用自]https://www.cnblogs.com/muscleape/p/9018308.html

定义一个UserServiceCglib,持有一个业务接口实现类的对象;
通过getInstance(Object target)方法创建一个动态代理类的实例对象;
当使用动态代理类中的增强方法时,会走到intercept方法中。

/**
 * 业务类
 * 
 * 没有实现接口
 * 
 * 如果类是final的,则无法生成代理对象,报错
 * 
 * 如果方法是final的,代理无效
 * 
 * @author Muscleape
 *
 */
public class UserServiceImpl {
	public void addUser() {
		System.out.println("增加一个用户。。。");
	}

	public void editUser() {
		System.out.println("编辑一个用户。。。");
	}
}

/**
 * cglib代理类,需要实现接口MethodInterceptor
 * 
 * @author Muscleape
 *
 */
public class UserServiceCglib implements MethodInterceptor {

	private Object target;

	public Object getInstance(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		// 设置回调方法
		enhancer.setCallback(this);
		// 创建代理对象
		return enhancer.create();
	}

	/**
	 * 实现MethodInterceptor接口中重写的方法
	 * 
	 * 回调方法
	 */
	@Override
	public Object intercept(Object object, Method method, Object[] args, 		  MethodProxy proxy) throws Throwable {
		System.out.println("事务开始。。。");
		Object result = proxy.invokeSuper(object, args);
		System.out.println("事务结束。。。");
		return result;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值