postProcessBeforeInitialization在Spring BeanPostProcessor中意味着什么?

时间:2015-03-26 06:53:45

标签: java spring spring-mvc javabeans

在XML文件中

<bean id="triangle" class="com.company.aop.model.Triangle">
    <property name="name" value="myTriangle"></property>
</bean>

<bean class="com.company.aop.DisplayNameBeanPostProcessor"></bean>

在DisplayNameBeanPostProcessor.java类

public class DisplayNameBeanPostProcessor implements BeanPostProcessor{

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        // TODO Auto-generated method stub
        if(bean instanceof Triangle) {
//          System.out.println("Tr "+(((Triangle) bean).getName().toString()));
            System.out.println("I am after intialisation");
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        // TODO Auto-generated method stub
        if(bean instanceof Triangle) {
            System.out.println("Tr "+(((Triangle) bean).getName().toString()));
        }
        return bean;
    }

}

现在,当我运行此代码时,它将转到带有参数bean和beanName的postProcessBeforeInitialization()方法,并打印消息“myTriangle”。在我的例子中,这个bean的名称字段的信息值为“myTriangle”。但是方法签名说它是在初始化之前然后如果尚未初始化那么已经传入它的bean是什么?

之间有什么区别
public Object postProcessAfterInitialization(Object bean, String beanName) 

public Object postProcessBeforeInitialization(Object bean, String beanName)

为什么这一行

System.out.println("Tr "+(((Triangle) bean).getName().toString()));
如果在初始化之前调用了方法,

在postProcessBeforeInitialization方法中输出名称?

2 个答案:

答案 0 :(得分:5)

您可以参考Spring文档here的5.8.1节。这里的关键点是“postProcessBeforeInitialization”应该被读作“postProcessBeforeInitializationCallback”,而“postProcessAfterInitialization”应该被读作“postProcessAfterInitializationCallback”。所以这些是在bean之前的Spring容器运行之前/之后的初始化回调之后的前后处理器。这也是这些方法的文档中传达的内容here

  

Object postProcessBeforeInitialization(Object bean,                                          String beanName)                                   抛出BeansException

     

在任何之前将此BeanPostProcessor应用于给定的新bean实例   bean初始化回调(如InitializingBean的   afterPropertiesSet或自定义init方法)。豆子已经存在了   填充了属性值。

注意它说“ bean已经填充了属性值”。 同样

  

Object postProcessAfterInitialization(Object bean,                                         String beanName)                                  抛出BeansException

     

在任何之后将此BeanPostProcessor应用于给定的新bean实例   bean初始化回调(如InitializingBean的   afterPropertiesSet或自定义init方法)。豆子已经存在了   填充了属性值。

答案 1 :(得分:2)

BeanPostProcessor bean是一种特殊的bean,它在任何其他bean之前创建并与新创建的bean交互。 postProcessBeforeInitializationpostProcessAfterInitialization应用于spring创建的任何其他bean。

但是方法签名说它是在初始化之前然后如果尚未初始化那么该bean被传递给它的是什么?

这里的初始化是指调用 triangle bean的init方法,因此before和post调用将调用包装在bean的init方法上。在此之前,构造函数和setter注入已经执行,这就是bean具有实际值的原因。