这篇文章主要讲解了“Springboot源码中的AbstractAdvisorAutoProxyCreator分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Springboot源码中的AbstractAdvisorAutoProxyCreator分析”吧!
Spring
的代理在上层中主要分为ProxyCreatorSupport
和ProxyProcessorSupport
,前者是基于代理工厂,后者是基于后置处理器,也可以认为后置就是自动代理器。当spring
容器中需要进行aop
进行织入的bean
较多时,简单采用ProxyFacotryBean
无疑会增加很多工作量(因为每个Bean
!都得手动写一个)。所以自动代理就发挥它的作用了。
在内部,Spring使用BeanPostProcessor
让自动生成代理。基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则在容器实例化Bean
时为匹配的Bean生成代理实例。代理创建器可以分为三类:
基于Bean配置名规则的自动代理生成器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator
基于Advisor
匹配机制的自动代理创建器它会对容器中的所有Advisor进行扫描,自动将这些切面应用到匹配的Bean中,实现类是DefaultAdvisorAutoProxyCreator
(它也支持前缀匹配)
基于Bean中AspectJ
注解的自动代理生成器:为包含AspectJ注解的切入的Bean自动创建代理实例,实现类是AnnotationAwareAspectJAutoProxyCreator
,它是我们的@EnableAspectJAutoProxy
导入的,这也是我们当下使用最为广泛的方式~
package com.github.dqqzj.springboot.aop;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @author qinzhongjian
* @date created in 2019-08-25 09:43
* @description: TODO
* @since JDK 1.8.0_212-b10
*/
@Component
public class MyBeanNameAutoProxyCreator extends BeanNameAutoProxyCreator {
@PostConstruct
public void init() {
super.setBeanNames("aopService", "abstractAutoProxyCreatorService");
super.setInterceptorNames("myMethodBeforeAdvice");
}
}
如果你想用自己注册的@Bean
代替@EnableAspectJAutoProxy
默认给你注册的自动创建器AnnotationAwareAspectJAutoProxyCreator
,那么你可以注册一个Bean名称如下的Bean即可:
// 手动注册一个自动代理创建器,且名字务必叫AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME
@Bean(AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME)
public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
...
}
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
...
}
AbstractAutoProxyCreator
是对自动代理创建器的一个抽象实现。最重要的是,它实现了SmartInstantiationAwareBeanPostProcessor
接口,因此会介入到Spring IoC
容器Bean实例化的过程,在AbstractAutowireCapableBeanFactory
中有这样一段代码
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
但是一般都不会生效的,因为这个resolveBeforeInstantiation
只是针对有自定义的targetsource
,因为自定义的targetsource
不是spring的bean那么肯定不需要进行后续的一系列的实例化 初始化。所以可以在resolveBeforeInstantiation直接进行proxy
。简单的说吧 ,这个代码可以忽略不计,开发者一般用不到。
package com.github.dqqzj.springboot.aop;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
/**
* @author qinzhongjian
* @date created in 2019-08-25 11:35
* @description: TODO
* @since JDK 1.8.0_212-b10
*/
public class AopServiceInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanClass.isInstance(AopService.class)) {
return new AopService();
}
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
这个是spring
第一次后置处理器的使用,如果这样直接就返回了,就相当于脱离了IOC
的生命周期了一样,依赖注入,属性填充等这些都没有进行处理,所以使用的时候一定要注意,最好别使用这个功能。
感谢各位的阅读,以上就是“Springboot源码中的AbstractAdvisorAutoProxyCreator分析”的内容了,经过本文的学习后,相信大家对Springboot源码中的AbstractAdvisorAutoProxyCreator分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4042447/blog/3097296