TheGir1 Springboot源码分析之AbstractAdvisorAutoProxyCreator
摘要:
Spring
的代理在上层中主要分为ProxyCreatorSupport
和ProxyProcessorSupport
,前者是基于代理工厂,后者是基于后置处理器,也可以认为后置就是自动代理器。当spring
容器中需要进行aop
进行织入的bean
较多时,简单采用ProxyFacotryBean
无疑会增加很多工作量(因为每个Bean
!都得手动写一个)。所以自动代理就发挥它的作用了。
Spring中自动创建代理器分类
在内部,Spring使用BeanPostProcessor
让自动生成代理。基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则在容器实例化Bean
时为匹配的Bean生成代理实例。代理创建器可以分为三类:
- 基于Bean配置名规则的自动代理生成器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为
BeanNameAutoProxyCreator
- 基于
Advisor
匹配机制的自动代理创建器它会对容器中的所有Advisor进行扫描,自动将这些切面应用到匹配的Bean中,实现类是DefaultAdvisorAutoProxyCreator
(它也支持前缀匹配) - 基于Bean中
AspectJ
注解的自动代理生成器:为包含AspectJ注解的切入的Bean自动创建代理实例,实现类是AnnotationAwareAspectJAutoProxyCreator
,它是我们的@EnableAspectJAutoProxy
导入的,这也是我们当下使用最为广泛的方式~
BeanNameAutoProxyCreator
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