BeanFactoryPostProcessors
BeanFactoryPostProcessor 为spring在容器初始化时对外对外暴露的扩展点,Spring IoC容器允许BeanFactoryPostProcessor在容器加载注册BeanDefinition完成之后读取BeanDefinition(配置元数据),并可以修改它。
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}
自定义的BeanFactoryPostProcessor子类,可以在实例化Bean之前对BeanDefinition(配置元数据)进行修改.
@Configuration
@ComponentScan(value = {"com.lb.spring.day7.part20"})
public class MyConfigration20 {
@Bean
public Moon moon(){
return new Moon();
}
}
@Component
public class LbBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("------------LbBeanFactoryPostProcessor.postProcessBeanFactory()------------------");
int beanCount = configurableListableBeanFactory.getBeanDefinitionCount();
System.out.println("获取到Bean的数量为:"+beanCount);
for (String name : configurableListableBeanFactory.getBeanDefinitionNames()){
System.out.println(name);
}
System.out.println("----------------------------------------------------------------------------------");
}
}
启动项目:
由一下日志可以发现执行postProcessBeanFactory方法时,Spring已经可以获得所有BeanDefinition(Bean的相关定义信息,并且Bean还没有实例化注入到容器),可以对任何Bean的BeanDefinition信息进行修改。
Moon constructor.....为自定义类的构造方法日志.则可以说明postProcessBeanFactory方法实在Bean实例化之前执行的。
------------LbBeanFactoryPostProcessor.postProcessBeanFactory()------------------
获取到Bean的数量为:9
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
myConfigration20
lbBeanFactoryPostProcessor
moon
----------------------------------------------------------------------------------
九月 04, 2020 4:24:02 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Moon constructor.....
BeanDefinitionRegistryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}
可以发现BeanDefinitionRegistryPostProcessor为BeanFactoryPostProcessor的子类,也具有修改BeanDefinition的功能,并且提供了可以向IOC容器中注册之前Bean的功能
@Component
public class LbBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
System.out.println("------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()------------------");
int beanCount = beanDefinitionRegistry.getBeanDefinitionCount();
System.out.println("获取到Bean的数量为:"+beanCount);
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Moon.class);
beanDefinitionRegistry.registerBeanDefinition("small_moon",rootBeanDefinition);
System.out.println("----------------------------------------------------------------------------------");
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanFactory()------------------");
int beanCount = configurableListableBeanFactory.getBeanDefinitionCount();
System.out.println("获取到Bean的数量为:"+beanCount);
System.out.println("----------------------------------------------------------------------------------");
}
}
启动项目:
由日志可以发现BeanDefinitionRegistryPostProcessor的子类执行顺序在BeanFactoryPostProcessor子类之前,并且先执行postProcessBeanDefinitionRegistry()方法后执行postProcessBeanFactory()方法
------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()------------------
获取到Bean的数量为:10
向Spring容器中添加id为small_moon的Moon对象
----------------------------------------------------------------------------------
------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanFactory()------------------
获取到Bean的数量为:11
----------------------------------------------------------------------------------
------------LbBeanFactoryPostProcessor.postProcessBeanFactory()------------------
获取到Bean的数量为:11
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
myConfigration20
lbBeanDefinitionRegistryPostProcessor
lbBeanFactoryPostProcessor
moon
small_moon
----------------------------------------------------------------------------------
九月 04, 2020 4:33:11 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Moon constructor.....
Moon constructor.....
BeanDefinitionRegistryPostProcessor 与 BeanFactoryPostProcessor执行顺序
为什么BeanDefinitionRegistryPostProcessor在BeanFactoryPostProcessor之前执行呢?
通过查看源码
BeanFactoryPostProcessor的执行顺序为:
- 执行所有类型为BeanDefinitionRegistry的BeanFactoryPostProcessor.postProcessBeanDefinitionRegistry()方法
- 执行所有类型为BeanDefinitionRegistry的BeanFactoryPostProcessor.postProcessBeanFactory()方法
- 执行继承PriorityOrdered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法
- 执行继承Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法
- 执行没有继承PriorityOrdered和Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法