【问题标题】:What can cause Spring IoC instantiate more than one instance of a singleton bean per WebApp?什么会导致 Spring IoC 为每个 WebApp 实例化多个单例 bean 实例?
【发布时间】:2012-11-12 18:45:39
【问题描述】:

我有一个基于 Spring 的 WebApp。在我的应用程序上下文中,我定义了这个 bean:

<bean id="someSingleton" class="com.fake.SomeSingleton" scope="singleton"/>

我有一个 Spring 调度 servlet 定义和一个具有 @Controller 注释的类,我自动连接了这个 bean,期望 Spring 只实例化这个类一次。但是,根据下面的调试代码,Spring不止一次地实例化了这个类:

private static final Semaphore SANITY_CHECK = new Semaphore(1);

public FakeSingleton(){
    if(!SANITY_CHECK.tryAcquire()){
      log.error("why?");
      System.exit(-1);
    else{
      log.error("OK");
    }
}

可能是什么原因?

注意:我使用的是 spring 3.1.2.RELEASE

编辑: 感谢给我的提示,我找到了罪魁祸首。
除了 DispatcherServlet,我的 web.xml 中还有一个 ContextLoaderListener。删除后,SomeSingleton 只被实例化了一次。

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>FakeService</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

【问题讨论】:

    标签: spring dependency-injection


    【解决方案1】:

    有几个可能的原因:

    • 你的类被一些 CGLIB 代理包裹,这会导致构造函数运行两次(与 @PostConstruct 回调相反,它总是每个 bean 运行一次)——一次用于你的类,一次用于继承代理

    • 更有可能的是,您的 bean 被两个上下文拾取:主上下文和 Spring MVC 一个。这是一个不好的做法,你应该避免它。通过一些 CLASSPATH 扫描检查您的 SomeSingleton 类是否未被 MVC 调度程序 servlet 上下文拾取。

    顺便说一句,在这样的代码中,使用简单的AtomicInteger 而不是Semaphore 是安全的。

    【讨论】:

    • 您能否再解释一下您的第一点?为什么代理不能像任何其他继承类一样工作并且只调用一次 super()(被代理的 bean 的构造函数)?
    【解决方案2】:

    一个单例是每个上下文一次,而不是每个宇宙热死一次。

    打开日志记录,看看为什么/如果整个应用上下文被多次创建。

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多