Spring - ApplicationContext.refresh与BeanPostProccessor小小记录

关于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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 1.1 Spring IoC容器和bean简介 本章介绍了Spring Framework实现的控制反转(IoC)...
    起名真是难阅读 2,621评论 0 8
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,753评论 2 22
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,952评论 4 21
  • 这不是一篇鸡汤。 人向来是需要打击才能坚持挣扎下去的,但是这并不意味着每天要灌下去几万字的毒鸡汤才管用。 初中时候...
    好多BANAna阅读 112评论 0 0