• 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 创建完成之后,可以在该回调中做一些事情

  • 相关阅读:
    TOJ5272: 逆矩阵
    TOJ4537: n阶行列式
    gym101532 2017 JUST Programming Contest 4.0
    Float(浮动)
    块级元素与行级元素
    MyBatis-Oracle生成主键,嵌套对象中的List增加
    MyBatis嵌套对象中的List查询
    dbcp properties
    Idea菜单字体大小调整
    DOM4J
  • 原文地址:https://www.cnblogs.com/pjfmeng/p/13937092.html
Copyright © 2020-2023  润新知