spring 后置处理器

1、BeanFactoryPostProcessor 

  BeanFactory后置处理器,是对BeanDefinition对象进行修改

2、BeanDefinitionRegistryPostProcessor  bean定义注册处理器

BeanFactoryPostProcessor 的子接口,也是对BeanDefinition对象进行修改

3、BeanPostProcessor   

bean后置处理器,在bean初始化之前和之后对bean对象进行修改

4、InstantiationAwareBeanPostProcessor 

 bean实例化之前和之后处理

这四种处理器在bean生命周期中都有着重要的作用

5、SmartInitializingSingleton

这个不参与bean的生命周期,是bean所有实例都生成之后,对bean做一些后置处理

 

BeanFactoryPostProcessor 

public interface BeanFactoryPostProcessor {

    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。

如PropertySourcesPlaceholderConfigurer,它用于解析bean定义中的属性值,以及注解@Value的值,使用的属性来源是当前的Spring Environment对象

 

BeanDefinitionRegistryPostProcessor  

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}


BeanFactoryPostProcessor的子接口,BeanFactoryPostProcessor的作用是在bean的定义信息已经加载但还没有初始化的时候执行方法postProcessBeanFactory()方法,而BeanDefinitionRegistryPostProcessor是在BeanFactoryPostProcessor的前面执行。
如ConfigurationClassPostProcessor,用来注册ComponentScan扫描出来的bean类

BeanPostProcessor   

public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }

 在bean实例的初始化方法回调之前调用BeanPostProcessor的postProcessBeforeInitialization的方法,在bean实例的初始化方法回调之后调用BeanPostProcessor的postProcessAfterInitialization的方法

 

InstantiationAwareBeanPostProcessor

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    //该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。
    //如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
//在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck()); //如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行 boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
//属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改 PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException; }

InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的子接口,是在bean实例化之前和之后调用,BeanPostProcessor 是在初始化之前和之后调用

postProcessAfterInstantiation在实例化之前调用

postProcessAfterInstantiation会在实例化之后,依赖注入和初始化方法之前。注册多个接口只要其中一个返回false,即停止后续执行。如果不想使用spring的自动注入(前提是已经使用了@Autowired注解),则对于特殊的bean则可以注册一个InstantiationAwareBeanPostProcessor使其不进行注入,使用自己的方式进行注入。

SmartInitializingSingleton

实现SmartInitializingSingleton的接口后,当所有单例 bean 都初始化完成以后, Spring的IOC容器会回调该接口的 afterSingletonsInstantiated()方法。

主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情

 

posted @ 2020-11-06 15:28  梦天幻  阅读(789)  评论(0编辑  收藏  举报