Spring - ApplicationContext.refr

2018-07-25  本文已影响0人  爱蛇

关于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>
上一篇 下一篇

猜你喜欢

热点阅读