gpt4 book ai didi

java - Singleton Spring bean 被创建多次

转载 作者:行者123 更新时间:2023-12-01 23:01:42 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

在您的问题中,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。

关于java - Singleton Spring bean 被创建多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23318278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com