Spring BeanPostProcessor 中的 postProcessBeforeInitialization 是什么意思?

3
在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;
    }

}

现在当我运行这段代码时,它会进入postProcessBeforeInitialization()方法,并带有bean和beanName参数,并打印消息“myTriangle”。在我的情况下,该bean具有名称字段并具有“myTriangle”值的信息。但是,在方法签名中声明它是在初始化之前,那么如果尚未初始化,传递给它的bean是什么?

”与其对应的是“

”,都是HTML标记中的段落标记,用于将文本分成段落。

public Object postProcessAfterInitialization(Object bean, String beanName) 

并且

public Object postProcessBeforeInitialization(Object bean, String beanName)

为什么这一行?
System.out.println("Tr "+(((Triangle) bean).getName().toString()));

如果在初始化之前调用了该方法,postProcessBeforeInitialization 方法将打印名称。
2个回答

6
您可以参考Spring文档中的5.8.1节(在此处)。关键点是,“postProcessBeforeInitialization”应该被理解为“postProcessBeforeInitializationCallback”,而“postProcessAfterInitialization”应该被理解为“postProcessAfterInitializationCallback”。因此,这些是在Spring容器在bean上运行before/after初始化回调之后的前置和后置处理器。这就是这些方法的文档所传达的(也在这里)
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException 应用此BeanPostProcessor到给定的新bean实例之前的任何bean初始化回调(例如InitializingBean的afterPropertiesSet或自定义init-method)。bean已经填充了属性值,请注意它说:“bean将已经填充属性值”。
同样,Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException 应用此BeanPostProcessor到给定的新bean实例之后的任何bean初始化回调(例如InitializingBean的afterPropertiesSet或自定义init-method)。bean已经填充了属性值。

现在在下面的情况中,beanFactory被传递为参数,而函数的名称是postProcessBeanFactory,这意味着bean工厂应该在此后处理器之后初始化? public class DisplayNameBeanPostProcessor implements BeanFactoryPostProcessor{ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }} - Mani

3

BeanPostProcessor beans是一种特殊类型的bean,在所有其他bean之前创建并与新创建的bean交互。Spring会在任何其他被创建的bean上应用postProcessBeforeInitializationpostProcessAfterInitialization

但方法签名表示它是在初始化之前,那么如果bean还没有初始化,它传递进去的是什么bean呢?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接