【问题标题】:Singleton spring bean is being created more than once不止一次创建单例 spring bean
【发布时间】:2014-04-27 01:11:45
【问题描述】:

我有一个名为 gameContext 的单例 spring bean,我的 spring bean 定义;

    <bean name="gameContext" scope="singleton"
      class="tr.com.hevi.game.numblock.core.context.GameContext"/>

我也使用这个类进行会话监听,这是我的 web.xml

<listener>
    <listener-class>
        tr.com.hevi.game.numblock.core.context.GameContext
    </listener-class>
</listener>

问题是 gameContext 被创建了两次。一;在加载弹簧上下文之前的一开始,第二个;在春天的背景下。

我确信我不会多次扫描组件。

我了解背后的原因,但不知道如何解决问题。一种可能的解决方案应该是在 spring 上下文而不是 web.xml 中添加侦听器,或者可能存在代理对象解决方案。

【问题讨论】:

    标签: java spring spring-mvc web.xml


    【解决方案1】:

    在您的问题中,spring 有 2 个对象,因为您配置了两次侦听器

    1. 第一个在web.xml中(在spring上下文之外)
    2. 在 spring 上下文中作为 bean。

    只有 1 个实例的最简单方法是使用 Servlet 3.0 规范。这里 ServletContext 有一个 addListener() 方法使用相同的方法。执行以下操作:

    @Component
    public class MyCustomListener implements javax.servlet.http.HttpSessionListener, ApplicationContextAware {
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            if (applicationContext instanceof WebApplicationContext) {
                ((WebApplicationContext) applicationContext).getServletContext().addListener(this);
            } else {
                //Either throw an exception or fail gracefully, up to you
                throw new RuntimeException("Must be inside a web application context");
            }
        }           
    }
    

    上述方法将导致您只创建 1 个侦听器对象,并将相同的对象注册为 Servlet 侦听器和 spring bean。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多