关于BeanPostProcessor概念的文章可以从下面的链接了解:
https://www.cnblogs.com/sishang/p/6576665.html
最近项目里需要一个场景,实例化一个事件中心和实例化一堆事件监听器,最后把监听器注册到事件中心里去。所以用到这个一个后置处理器,当事件中心和事件监听器都实例化完成以后,完成这个实现。
但在写测试用例的时候发现同一个bean 被BeanPostProccessor多次处理,
原因是代码里多次触发了refresh方法.....
代码如下:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-application-EventListenerAutoRegister.xml");
context.refresh();
System.out.println("refresh complete");
执行结果:
## before init ## bean name:java.lang.String#0 - type:String
## after init ## bean name:java.lang.String#0 - type:String
## before init ## bean name:java.lang.String#0 - type:String
## after init ## bean name:java.lang.String#0 - type:String
refresh complete
同一个bean 被初始化了两次,
意思就是每refresh一次,就会重新触发Bean 的构造,从而beanPostProccessor也会被多次调用。
spring-application-EventListenerAutoRegister.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="java.lang.String"></bean>
<bean id="autoRegister" class="spring.EventListenerRegisterBeanPostProcessor">
</bean>
</beans>