Spring AOP底层实现

Spring AOP 代理实现有两种: JDK动态代理Cglib框架动态代理

JDK动态代理 简单介绍http://blog.csdn.net/qq_34446485/article/details/77460855

JDK API 内置 ---- 通过 Proxy类,为目标对象创建代理 (必须面向接口代理 )

public class JdkProxyFactory implements InvocationHandler {
	// 被代理对象
	private Object target;

	// 在构造方法对象时,传入被代理对象
	public JdkProxyFactory(Object target) {
		this.target = target;
	}

	// 创建代理
	public Object createProxy() {
		// 三个参数: 类加载器、 实现接口、 invocationhandler
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("记录日志!!!!!!");
		// 调用目标真实方法
		// target 被代理对象, args 方法参数 , method 被调用的方法
		return method.invoke(target, args);
	}
}

缺点: 使用Jdk动态代理,必须要求target目标对象,实现接口 ,如果没有接口,不能使用Jdk动态代理 

Cglib 动态代理

CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。


Cglib 不但可以对接口进行代理,也可以对目标类对象,实现代理 (解决了 Jdk 只能对接口代理问题 )在spring3.2版本 core包中内置cglib 类 

public class CglibProxyFactory implements MethodInterceptor {
	// 被代理目标对象
	private Object target;

	// 在构造工厂时传入被代理对象
	public CglibProxyFactory(Object target) {
		this.target = target;
	}

	// 创建代理对象方法
	public Object createProxy() {
		// 1、 创建Enhancer对象
		Enhancer enhancer = new Enhancer();

		// 2、 cglib创建代理,对目标对象,创建子类对象
		enhancer.setSuperclass(target.getClass());

		// 3、传入 callback对象,对目标增强
		enhancer.setCallback(this);

		return enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		System.out.println("记录日志......");
		// 按照JDK编程
		return method.invoke(target, args);
	}
}


Cglib 创建代理思想: 对目标类创建子类对象 
设置 superClass 对哪个类创建子类 (类似 JDK代理 接口)
设置 callback 实现增强代码 (类似 JDK代理 InvocationHandler )


在cglib的callback函数中,要执行被代理对象的方法 
method.invoke(target, args); 等价于 methodProxy.invokeSuper(proxy, args); 
优先对接口代理 (使用JDK代理),如果目标没有接口,才会使用cglib代理 !





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值