目录
一. BeanFactoryPostProcessor
1. 解释与使用示例
- BeanFactoryPostProcessor 是一个接口,与BeanPostProcessor 不同的是
- 该接口中有一个 postProcessBeanFactory() 抽象方法
- BeanPostProcessor 是 bean 的后置处理器,监控 bean初始化前后,拦截执行 BeanPostProcessor 中的方法
- BeanFactoryPostProcessor 可以看为是更上一层的后置处理器,(可以理解为 BeanFactory 的后置处理器)当所有 bean 加载完成放入Beanfactory 后,但是还未创建时执行该接口中的方法
- 示例:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/*注意不要忘记将自定义的 BeanFactoryPostProcessor 注入到容器中*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
//继承 BeanFactoryPostProcessor 接口,重写接口中的 postProcessBeanFactory() 方法
//此时在启动Spring容器后,加载所有bean以后,开始创建 bean 以前会先执行该方法,然后在创建容器中的 bean
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
//通过 configurableListableBeanFactory 可以拿到:
//获取工厂中所有 bean 的名字
String[] names = configurableListableBeanFactory.getBeanDefinitionNames();
//获取工厂中存有的所有 bean 的个数
int beanCount = configurableListableBeanFactory.getBeanDefinitionCount();
//获取工厂中所有继承了 BeanPostProcessor 的后置处理器个数
int countProcessor = configurableListableBeanFactory.getBeanPostProcessorCount();
}
}
2. 运行原理
- 在创建 IOC 容器时,会调用 refresh() 方法,在该方法中会调用 invokeBeanFactoryPostProcessors(beanFactory)
- 在 invokeBeanFactoryPostProcessors(beanFactory) 方法中调用了 invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors())
- 查看该方法
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
Set<String> processedBeans = new HashSet();
int var9;
ArrayList priorityOrderedPostProcessors;
ArrayList orderedPostProcessors;
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList();
List<BeanDefinitionRegistryPostProcessor> registryPostProcessors = new LinkedList();
Iterator var6 = beanFactoryPostProcessors.iterator();
while(var6.hasNext()) {
BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var6.next();
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor)postProcessor;
registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
registryPostProcessors.add(registryPostProcessor);
} else {
regularPostProcessors.add(postProcessor);
}
}
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
priorityOrderedPostProcessors = new ArrayList();
String[] var22 = postProcessorNames;
var9 = postProcessorNames.length;
int var10;
for(var10 = 0; var10 < var9; ++var10) {
String ppName = var22[var10];
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
registryPostProcessors.addAll(priorityOrderedPostProcessors);
invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
orderedPostProcessors = new ArrayList();
String[] var26 = postProcessorNames;
var10 = postProcessorNames.length;
int var30;
for(var30 = 0; var30 < var10; ++var30) {
String ppName = var26[var30];
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(beanFactory, orderedPostProcessors);
registryPostProcessors.addAll(orderedPostProcessors);
invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
boolean reiterate = true;
while(reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
String[] var28 = postProcessorNames;
var30 = postProcessorNames.length;
for(int var33 = 0; var33 < var30; ++var33) {
String ppName = var28[var33];
if (!processedBeans.contains(ppName)) {
BeanDefinitionRegistryPostProcessor pp = (BeanDefinitionRegistryPostProcessor)beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
registryPostProcessors.add(pp);
processedBeans.add(ppName);
pp.postProcessBeanDefinitionRegistry(registry);
reiterate = true;
}
}
}
invokeBeanFactoryPostProcessors((Collection)registryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
invokeBeanFactoryPostProcessors((Collection)regularPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
} else {
invokeBeanFactoryPostProcessors((Collection)beanFactoryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
}
//1.获取 BeanFactory 中所有 BeanFactoryPostProcessor 的 bean 的名字
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList();
List<String> orderedPostProcessorNames = new ArrayList();
List<String> nonOrderedPostProcessorNames = new ArrayList();
String[] var21 = postProcessorNames;
int var24 = postProcessorNames.length;
String ppName;
//2.遍历获取到的 BeanFactoryPostProcessor 名字,对容器中所有 BeanFactoryPostProcessor 进行排序,这样就做到了不同 BeanFactoryPostProcessor 先后执行的顺序不同
for(var9 = 0; var9 < var24; ++var9) {
ppName = var21[var9];
if (!processedBeans.contains(ppName)) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
} else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
} else {
nonOrderedPostProcessorNames.add(ppName);
}
}
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
priorityOrderedPostProcessors = new ArrayList();
Iterator var25 = orderedPostProcessorNames.iterator();
while(var25.hasNext()) {
String postProcessorName = (String)var25.next();
//=========3.使用 beanFactory,通过通过前面获取到的 BeanFactoryPostProcessor 的名字获取bean==================
priorityOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
//=============4.遍历获执行取到的 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法=================
invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
orderedPostProcessors = new ArrayList();
Iterator var32 = nonOrderedPostProcessorNames.iterator();
while(var32.hasNext()) {
ppName = (String)var32.next();
orderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors((Collection)orderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
beanFactory.clearMetadataCache();
}
- 查看 invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory) 方法
二. BeanDefinitionRegistryPostProcessor
1. 解释与使用示例
-
定义注册中心的后置处理器,该接口是 BeanFactoryPostProcessor 的一个子接口,与 BeanFactoryPostProcessor 不同的是
-
与 BeanFactoryPostProcessor 的区别
- 该接口中增加了一个 postProcessBeanDefinitionRegistry() 抽象方法,该方法在所有 bean 定义信息将要被加载,加载前执行
- 执行顺序早于 BeanFactoryPostProcessor , 与 BeanFactoryPostProcessor中的postProcessBeanFactory()方法都是在 refresh() 中invokeBeanFactoryPostProcessors(beanFactory) 被调用的,在加载所有 bean 以前,首先获取执行 BeanDefinitionRegistryPostProcessor 中的 postProcessBeanDefinitionRegistry() 方法,然后执行该接口中的 postProcessBeanFactory() 方法,然后才是 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法
- 使用示例
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.*;
import org.springframework.stereotype.Component;
//不要忘记注入到容器中
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
/**
* 容器中所有 bean 加载前要执行的方法
* BeanDefinitionRegistry 所有 bean 定义信息的存储中心,
* IOC 容器通过 BeanFactory 创建所有 bean,
* 而BeanFactory 是按照这个对象中保存的 bean 的信息去加载创建的
* 通过这个对象可以获取到容器中将要加载创建的所有bean
* 并且可以通过这个对象,手动的删除,添加,设置这些将要被加载注册的bean
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
//获取要加载创建的 bean 的个数
int count = beanDefinitionRegistry.getBeanDefinitionCount();
//手动添加要向容器中创建注入的bean,例如手动注入自定义的Person
//第一个String参数是手动添加的bean 的名字
//第二个,需要一个包含了要添加的bean 的类型的 RootBeanDefinition 对象
RootBeanDefinition definition = new RootBeanDefinition(Person.class);
//第二个参数的方式二: 通过构建器
//AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
beanDefinitionRegistry.registerBeanDefinition("", definition);
//手动删除要加载注入到容器中的bean
beanDefinitionRegistry.removeBeanDefinition("Person");
}
//容器中所有 bean 加载后 要执行的方法
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
2. 执行原理
- 在创建 IOC 容器时,会调用 refresh() 方法,与执行 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法是同一个路口,查看上面 "BeanFactoryPostProcessor 运行原理 "中的第3步,在postProcessBeanFactory方法执行前先获取 BeanDefinitionRegistryPostProcessor 会先调用执行 postProcessBeanDefinitionRegistry() 方法
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
Set<String> processedBeans = new HashSet();
int var9;
ArrayList priorityOrderedPostProcessors;
ArrayList orderedPostProcessors;
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList();
List<BeanDefinitionRegistryPostProcessor> registryPostProcessors = new LinkedList();
Iterator var6 = beanFactoryPostProcessors.iterator();
while(var6.hasNext()) {
BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var6.next();
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor)postProcessor;
registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
registryPostProcessors.add(registryPostProcessor);
} else {
regularPostProcessors.add(postProcessor);
}
}
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
priorityOrderedPostProcessors = new ArrayList();
String[] var22 = postProcessorNames;
var9 = postProcessorNames.length;
int var10;
for(var10 = 0; var10 < var9; ++var10) {
String ppName = var22[var10];
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
registryPostProcessors.addAll(priorityOrderedPostProcessors);
invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
orderedPostProcessors = new ArrayList();
String[] var26 = postProcessorNames;
var10 = postProcessorNames.length;
int var30;
for(var30 = 0; var30 < var10; ++var30) {
String ppName = var26[var30];
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(beanFactory, orderedPostProcessors);
registryPostProcessors.addAll(orderedPostProcessors);
invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
boolean reiterate = true;
while(reiterate) {
reiterate = false;
//1.获取容器中所有 BeanDefinitionRegistryPostProcessor 的名字
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
String[] var28 = postProcessorNames;
var30 = postProcessorNames.length;
//遍历执行方法
for(int var33 = 0; var33 < var30; ++var33) {
String ppName = var28[var33];
if (!processedBeans.contains(ppName)) {
BeanDefinitionRegistryPostProcessor pp = (BeanDefinitionRegistryPostProcessor)beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
registryPostProcessors.add(pp);
processedBeans.add(ppName);
//2.执行获取到的 BeanDefinitionRegistryPostProcessors 中的 postProcessBeanDefinitionRegistry() 方法
pp.postProcessBeanDefinitionRegistry(registry);
reiterate = true;
}
}
}
//3.执行 BeanDefinitionRegistryPostProcessors 中的 postProcessBeanFactory() 方法
invokeBeanFactoryPostProcessors((Collection)registryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
invokeBeanFactoryPostProcessors((Collection)regularPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
} else {
invokeBeanFactoryPostProcessors((Collection)beanFactoryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
}
//1.获取 BeanFactory 中所有 BeanFactoryPostProcessor 的 bean 的名字
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList();
List<String> orderedPostProcessorNames = new ArrayList();
List<String> nonOrderedPostProcessorNames = new ArrayList();
String[] var21 = postProcessorNames;
int var24 = postProcessorNames.length;
String ppName;
//2.遍历获取到的 BeanFactoryPostProcessor 名字,对容器中所有 BeanFactoryPostProcessor 进行排序,这样就做到了不同 BeanFactoryPostProcessor 先后执行的顺序不同
for(var9 = 0; var9 < var24; ++var9) {
ppName = var21[var9];
if (!processedBeans.contains(ppName)) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
} else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
} else {
nonOrderedPostProcessorNames.add(ppName);
}
}
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
priorityOrderedPostProcessors = new ArrayList();
Iterator var25 = orderedPostProcessorNames.iterator();
while(var25.hasNext()) {
String postProcessorName = (String)var25.next();
//=========3.使用 beanFactory,通过通过前面获取到的 BeanFactoryPostProcessor 的名字获取bean==================
priorityOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
//=============4.遍历执行取到的 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法=================
invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
orderedPostProcessors = new ArrayList();
Iterator var32 = nonOrderedPostProcessorNames.iterator();
while(var32.hasNext()) {
ppName = (String)var32.next();
orderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors((Collection)orderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
beanFactory.clearMetadataCache();
}