Spring AOP源码解析:生成代理对象
Spring AOP源码解析:生成代理对象
生成代理对象
上一节我们分享了获取bean对应的切面(advice)的过程,本节我们接着分享生成代理对象的过程
AbstractAutoProxyCreator#wrapIfNecessary
刚开始的3个if条件是直接跳过不需要代理的bean,例如用户自定义的targetSource,spring aop的基础类等。
getAdvicesAndAdvisorsForBean是获取应用在当前Bean上面的切面,如果没有的话就不用进行代理了
在生成代理的时候,并不是对原始的Bean直接生成代理对象,而是将Bean包装为TargetSource,然后对TargetSource生成代理对象。
为什么中间加一道呢? 这样我们就可以利用TargetSource对被代理的类做一些操作,例如池化,热部署等
AbstractAutoProxyCreator#createProxy
ProxyFactory#getProxy
用工厂模式来创建AopProxy,工厂的实现类只有一个DefaultAopProxyFactory
config.isOptimize:控制通过cglib创建的代理是否使用激进的优化策略,默认是false,一般也不会改变
config.isProxyTargetClass:是否使用cglib来创建代理对象,默认是false
// 可以通过如下方式设置为true@EnableAspectJAutoProxy(proxyTargetClass = true)
hasNoUserSuppliedProxyInterfaces:代理类是否实现了接口
所以一般情况下代理类实现了接口,则使用jdk动态代理,否则使用cglib代理 可以通过设置@EnableAspectJAutoProxy(proxyTargetClass = true)统一使用cglib代理。
使用cglib代理的时候,当代理对象是个接口,或者是代理对象是jdk动态代理对象时,依旧会使用jdk动态代理
举个例子,当我们对EchoService进行动态代理时,虽然配置了@EnableAspectJAutoProxy(proxyTargetClass = true)来使用cglib进行代理,但因为被代理是jdk动态代理对象,因此还是会使用jdk动态代理
@Beanpublic EchoService echoService() { return (EchoService) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{EchoService.class}, new EchoProxy());}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~