spring加载流程之注册BeanPostProcessor
缘起: 继spring执行了BeanFactoryPostProcessor后spring加载流程refresh之invokeBeanFactoryPostProcessors(beanFactory),接下来就是注册BeanPostProcessor
注册BeanPostProcessor
/**
* 注册BeanPostProcessor
* 自定义以及spring内部的
*/
registerBeanPostProcessors(beanFactory);
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
获取容器中bd类型为BeanPostProcessor的bdName
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
先来看一下这里的postProcessorNames
spring默认的3个类型为BeanPostProcessor的bd
默认情况下应该只有三个,是在初始化AnnotatedBeanDefinitionReader时注册的spring加载流程之AnnotatedBeanDefinitionReader
- AutowiredAnnotationBeanPostProcessor
- RequiredAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor
自定义的类型为BeanPostProcessor的bd
1. 可以自定义bd(需要添加元注解,能够被扫描注册进容器)实现BeanPostProcessor接口,这时候postProcessorNames
就会出现自定义bd的beanName
2. 通过@Enable
注解导入,例如我在测试aop时用到了@EnableAspectJAutoProxy
、@EnableAsync
注解,spring就会注册截图中出现的两个额外的bd
定义BeanPostProcessor的个数
类型
为BeanPostProcessor的bd的数量 + 已经注册
的BeanPostProcessor数量 + 1
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
获取已经注册的BeanPostProcessor个数
beanFactory.getBeanPostProcessorCount()
这里的BeanPostProcessor是通过执行beanFactory.addBeanPostProcessor(bpp)
添加到
List<BeanPostProcessor> beanPostProcessors = new ArrayList();
中去的
debugger可知,此时beanPostProcessors里面有3个,这是spring默认的,那么何时添加进去的呢?
spring默认添加的BeanPostProcessor
1. 执行spring加载流程refresh之prepareBeanFactory(beanFactory)时添加了两个后置处理器,ApplicationContextAwareProcessor与ApplicationListenerDetector
2. 还有一个是在实行spring加载流程refresh之invokeBeanFactoryPostProcessors(beanFactory)添加的
/**
* 前面执行的是BeanFactoryPostProcessor的子类BeanDefinitionRegistryPostProcessor的回调
* 现在执行BeanFactoryPostProcessor的回调
*/
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
执行ConfigurationClassPostProcessor.postProcessBeanFactory
private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors,ConfigurableListableBeanFactory beanFactory)
{
Iterator var2 = postProcessors.iterator();
while(var2.hasNext()) {
BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var2.next();
postProcessor.postProcessBeanFactory(beanFactory);
}
}
添加ImportAwareBeanPostProcessor后置处理器
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
int factoryId = System.identityHashCode(beanFactory);
if (this.factoriesPostProcessed.contains(factoryId)) {
throw new IllegalStateException("postProcessBeanFactory already called on this post-processor against " + beanFactory);
} else {
this.factoriesPostProcessed.add(factoryId);
if (!this.registriesPostProcessed.contains(factoryId)) {
this.processConfigBeanDefinitions((BeanDefinitionRegistry)beanFactory);
}
this.enhanceConfigurationClasses(beanFactory);
// 添加后置处理器
beanFactory.addBeanPostProcessor(new ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor(beanFactory));
}
}
自定义添加的BeanPostProcessor
可以通过自定义bd(不需要被注册进容器)实现BeanPostProcessor接口,然后
- 自定义一个BFPP,将BPP添加进去
@Component
public class ServiceImpl implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
configurableListableBeanFactory.addBeanPostProcessor("bpp");
}
}
- 或者
public static void main(String[] args){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//context.publishEvent(new MyEvent(new Object()));
context.register(AppConfig.class);
// 获取beanFactory
ConfigurableListableBeanFactory factory = context.getBeanFactory();
// 添加BPP
factory.addBeanPostProcessor(bpp);
context.refresh();
}
注册BeanPostProcessorChecker
这也是个BPP,猜测用来校验bd是否有BPP处理,初始化beanPostProcessorTargetCount
,其中之前的 1
就是它自己
排序/注册
这里根据bdName获取bd,然后排序(如果实现了排序接口),再就是注册进beanPostProcessors
中
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList();
List<BeanPostProcessor> internalPostProcessors = new ArrayList();
List<String> orderedPostProcessorNames = new ArrayList();
List<String> nonOrderedPostProcessorNames = new ArrayList();
String[] var8 = postProcessorNames;
int var9 = postProcessorNames.length;
String ppName;
BeanPostProcessor pp;
for(int var10 = 0; var10 < var9; ++var10) {
ppName = var8[var10];
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
} else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
} else {
nonOrderedPostProcessorNames.add(ppName);
}
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
registerBeanPostProcessors(beanFactory, (List)priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors = new ArrayList();
Iterator var14 = orderedPostProcessorNames.iterator();
while(var14.hasNext()) {
String ppName = (String)var14.next();
BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(beanFactory, orderedPostProcessors);
registerBeanPostProcessors(beanFactory, (List)orderedPostProcessors);
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList();
Iterator var17 = nonOrderedPostProcessorNames.iterator();
while(var17.hasNext()) {
ppName = (String)var17.next();
pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, (List)nonOrderedPostProcessors);
sortPostProcessors(beanFactory, internalPostProcessors);
registerBeanPostProcessors(beanFactory, (List)internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));