比较init-method,afterPropertiesSet和BeanPostProcessor其一BeanPostProcessor

217 阅读1分钟

init-method,afterPropertiesSet和BeanPostProcessor的作用都是能使用户在spring bean初始化时完成自定义的方法,但实现的方式各有不同,顺序从先到后依次是:BeanPostProcessor的postProcessBeforeInitialization > afterPropertiesSet > init-method > BeanPostProcessor的postProcessAfterInitialization

  1. BeanPostProcessor:

  2. 概念:BeanPostProcessor允许自定义修改SpringBeanFactory创建的新的bean实例。BeanPostProcessor接口由两个回调方法组成,分别是postProcessBeforeInitialization 和postProcessAfterInitialization。对于由容器创建的每个bean实例,BeanPostProcessor都会在调用容器初始化方法之前和之后从容器中回调这个bean。一些spring AOP的类(如:AbstractAdvisingBeanPostProcessor)就实现了BeanPostProcessor来提供代理包装逻辑。

  3. 如何创建一个BeanPostProcessor

    1. 实现BeanPostProcessor接口;

    2. 实现两个回调方法。

       import org.springframework.beans.BeansException;
       import org.springframework.beans.factory.config.BeanPostProcessor;
       ​
       public class CustomBeanPostProcessor implements BeanPostProcessor
       {
           public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
           {
               System.out.println("Called postProcessBeforeInitialization() for :" + beanName);
               return bean;
           }
           public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
           {
               System.out.println("Called postProcessAfterInitialization() for :" + beanName);
               return bean;
           }
       }
      
  4. 如何注册BeanPostProcessor:在配置文档applicationContext.xml中配置一个BeanPostProcessor之后,ApplicationContext会自动检测(实现BeanPostProcessor接口的配置元数据中定义的)所有bean,并将这些bean注册为BeanPostProcessor。然后spring将在初始化回调方法之前和之后将每个bean传递给这两个方法,在这两个方法中我们可以实现自己的处理逻辑。需要注意,BeanPostProcessor针对的是spring上下文中的所有bean

参考文章:

  1. juejin.cn/post/684490…

  2. blog.csdn.net/dreamrealis…