您的位置:首页 > 运维架构

Aop源码分析之生成代理对象

2016-05-08 16:04 573 查看
Java中生成代理对象有两种方式,一种是Jdk原生的动态代理,另一种就是利用Cglib。Jdk原生的动态代理只能实现对接口的代理,无法实现对Class类的代理,因此Spring中引入Cglib来实现Class类的动态代理。

Aop中代理对象是在ProxyFactoryBean类的getSingletonInstance方法中生成的。



进入createAopProxy方法。createAopProxy方法中只是简单的调用了下DefaultAopProxyFactory类的createAopProxy方法。那么重点来分析下createAopProxy方法。



createAopProxy方法中有两种代理方式,分别是Jdk和Cglib,如果被代理的是接口,就用Jdk代理方式,如果是类,就用Cglib代理方式。

回到getProxy方法,查看使用这两种方式生成代理对象的具体过程。



这里以Cglib的方式为例。







首先从advised中获取配置文件中配置的目标对象,即target对象。然后创建并配置Cglib的Enhancer对象,Enhancer对象是Cglib中实现动态代理的主要操作类。设置Enhancer对象的过程中,设置其setCallbacks方法是重点。Enhancer中的Callbacks就跟Jdk的Proxy对象的invoke方法一样,代理相关逻辑的实现都在该方法中,也就是说Aop相关的功能都封装在里面。最后使用Enhancer的create方法生成代理对象。经过这一步之后,通过getBean方法获得的对象就不是目标对象原始的对象了,而是代理对象。



这个时候调用目标对象相应的方法就会被拦截器所拦截,对于不同的代理对象生成方式会调用不同的拦截回调入口。对于Jdk代理方式,因为实现了InvocationHandler接口,所以回调入口就是invoke。而对于Cglib方式,使用的则是回调方法中设置好的DynamicUnadvisedExposedInterceptor类的intercept方法。

拦截器和回调方法都已设置好,只要调用目标对象被代理的方法就会触发这些拦截器并调用回调方法。那么拦截器是如何实现的?回调方法里面有些什么呢?下回分解。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: