<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
意思是bean定义注册中心后置处理,他继承了bean工厂后置处理器,
在所有bean定义还没有加载到bean工厂之前,先执行这个对应的方法
也就是在
BeanFactoryPostProcessor 之前被调用
我们来看下代码
public class Linux {
public Linux(){
System.out.println("实例化对象,创建对象,new对象");
}
}
利用下面的代码 可以给容器注册一些组件
beanDefinitionRegistry.registerBeanDefinition
@Component
public class My implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
System.out.println("后置处理bean定义注册中心:"+beanDefinitionRegistry.getBeanDefinitionCount());
//在这里 还可以往容器中注册 自定义bean
RootBeanDefinition rootBeanDefinition=new RootBeanDefinition(Zd.class);
beanDefinitionRegistry.registerBeanDefinition("zd",rootBeanDefinition);
System.out.println("注册后bean定义数量:"+beanDefinitionRegistry.getBeanDefinitionCount());
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("bean定义的数量:"+configurableListableBeanFactory.getBeanDefinitionCount());
}
}
/**
* 实现bean工厂后置处理器, 使用@Component注解,吧当前对象注入到spring容器中
*/
@Component
public class Sp implements BeanFactoryPostProcessor {
//bean定义已经加载到bean工厂, 但是还没有创建bean对象
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
String[] beanDefinitionNames = configurableListableBeanFactory.getBeanDefinitionNames();
System.out.println("===========bean定义的名称====================");
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
System.out.println("===============================");
}
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestConfig.class);
}
}
//扫描包 使得 使用@Component注解生效
@ComponentScan("com.dmg")
@Configuration
public class TestConfig {
//吧当前对象注入到容器中
@Bean
public Linux linux(){
return new Linux();
}
}
public class Zd {
public Zd(){
System.out.println("new zd");
}
}
可以看到先执行了实现
BeanDefinitionRegistryPostProcessor类的对应方法
在执行实现了BeanFactoryPostProcessor类的方法
最后才是new对象,也就是创建实例,实例化对象
接下来我们来看下源码
可以看到在这里会执行bean定义注册中心后置处理方法
然后从容器中找到
BeanDefinitionRegistryPostProcessor放入currentRegistryProcessors
然后调用实现了bean定义注册中心后置处理的类 对应的方法,进入对应的类
当我们执行完了bean定义注册中心后置处理,
那么这个时候才执行bean工厂后置处理 调用
invokeBeanFactoryPostProcessors
在这里会从容器中找到
BeanFactoryPostProcessor
放入对应的regularPostProcessors,orderedPostProcessors,nonOrderedPostProcessors中
然后遍历所有的bean工厂后置处理,进入
postProcessBeanFactory方法
等这些走完之后,在执行
finishBeanFactoryInitialization方法
完成bean的创建,也就是new对象,实例化对象
最终的顺序就是
BeanDefinitionRegistryPostProcessor-》BeanFactoryPostProcessor
-》new对象