zoukankan      html  css  js  c++  java
  • 转-Spring bean处理-InitializingBean&BeanPostProcessor&BeanFactoryPostProcessor

    转自  http://elim.iteye.com/blog/2017466

    执行顺序:

    BeanFactoryPostProcessor.postProcessBeanFactory
    UserBean's constructor
    UserBean 's username property set
    BeanPostProcessor.postProcessBeforeInitialization
    InitializingBean.afterPropertiesSet
    BeanPostProcessor.postProcessAfterInitialization

    Spring bean处理——回调函数

         Spring中定义了三个可以用来对Spring bean或生成bean的BeanFactory进行处理的接口,InitializingBean、BeanPostProcessor和BeanFactoryPostProcessor。通过实现这三个接口我们就可以对Spring bean进行处理了。

    InitializingBean接口

           InitializingBean中定义了一个afterPropertiesSet()方法。当BeanFactory将我们的bean实例化并且设置好了对应的属性之后,如果我们的bean实现了InitializingBean接口,则会调用对应的afterPropertiesSet()方法。那么我们就可以在这个方法体里面对当前bean的属性进行更改等其它操作。

    Java代码  
    1. @Component("beanA")  
    2. public class BeanA implements InitializingBean {  
    3.    
    4.    /** 
    5.     * 回调函数,会在bean属性设置完成后调用 
    6.     */  
    7.    public void afterPropertiesSet() throws Exception {  
    8.       System.out.println("回调函数,会在bean属性设置完成后调用");  
    9.    }  
    10.    
    11. }  

      

    BeanPostProcessor接口

           BeanPostProcessor接口实现类可以在bean初始化前后对bean做一些处理。ApplicationContext可以自动检测到其中的bean是否已实现了BeanPostProcessor接口,如果已经实现了该接口它会自动把它当做一个BeanPostProcessor进行处理。然后在需要调用BeanPostProcessor时进行调用。BeanPostPorcessor中定义了两个方法,postProcessBeforeInitialization()和postProcessAfterInitialization()。

    l  postProcessBeforeInitialization(Object bean, String beanName)方法将在调用bean的初始化方法之前被调用。方法参数分别表示当前的bean对象和对应的bean名称。

    l  postProcessAfterInitialization(Object bean, String beanName)方法将在调用bean的初始化方法之后被调用。

           BeanPostProcessor是针对于容器中的所有的bean的。一旦容器中定义有BeanPostProcessor,那么容器中的每一个bean在初始化前后都会调用BeanPostProcessor对应的方法。

    Java代码  
    1. @Component  
    2. public class MyBeanPostProcessor implements BeanPostProcessor {  
    3.    
    4.    /** 
    5.     * 任何bean对象在初始化方法回调之后都会调用BeanPostProcessor的 
    6.     * postProcessAfterInitialization方法。我们可以在该方法体里面对返回的bean再做一层封装。 
    7.     * 调用该方法前,我们传递进来的bean对象是已经填充好了属性值的。当我们把BeanPostProcessor作为 
    8.     * 一个bean定义在ApplicationContext中时,ApplicationContext会自动检测到它并把它当做 
    9.     * 一个BeanPostProcessor进行调用。 
    10.     */  
    11.    public Object postProcessAfterInitialization(Object bean, String beanName)  
    12.          throws BeansException {  
    13.       System.out.println(bean + "after initialization, beanName is " + beanName);  
    14.       return bean;  
    15.    }  
    16.    
    17.    /** 
    18.     * 任何bean对象在初始化方法回调之前都会调用BeanPostProcessor的 
    19.     * postProcessBeforeInitialization方法。调用该方法前,我们传递进来的 
    20.     * bean对象是已经填充好了属性值的。 
    21.     */  
    22.    public Object postProcessBeforeInitialization(Object bean, String beanName)  
    23.          throws BeansException {  
    24.       System.out.println(bean + "beforeInitialization, beanName is " + beanName);  
    25.       return bean;  
    26.    }  
    27.    
    28. }  
    29.    

    BeanFactoryPostProcessor接口

    Java代码  
    1.        BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理。BeanFactoryPostProcessor是针对于bean容器的,在调用它时,BeanFactory只加载了bean的定义,还没有对它们进行实例化,所以我们可以通过对BeanFactory的处理来达到影响之后实例化bean的效果。跟BeanPostProcessor一样,ApplicationContext也能自动检测和调用容器中的BeanFactoryPostProcessor。  
    2. @Component  
    3. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {  
    4.    
    5.    /** 
    6.     * BeanFactoryPostProcessor的postProcessBeanFactory()方法会在当前BeanFactory初始化 
    7.     * 以后,并且所有的bean定义都已经被加载,但是还没有对应的实例时被调用。所以我们可以在该方法体里面通过 
    8.     * BeanFactory做一些操作。当我们把BeanFactoryPostProcessor作为一个bean定义在ApplicationContext中时, 
    9.     * ApplicationContext会自动检测到它并把它当做一个BeanFactoryPostProcessor进行调用。 
    10.     */  
    11.    public void postProcessBeanFactory(  
    12.          ConfigurableListableBeanFactory beanFactory) throws BeansException {  
    13.       System.out.println("postProcessBeanFactory......");  
    14.    }  
    15.    
    16. }  
  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/binnzhao/p/6985465.html
Copyright © 2011-2022 走看看