【问题标题】:How to create a single instance of object across entire Spring MVC web application?如何在整个 Spring MVC Web 应用程序中创建单个对象实例?
【发布时间】:2020-07-08 06:56:26
【问题描述】:

我有一个 Spring MVC Web 应用程序(基于 XML,没有注释)。我想在我的应用程序启动时只创建一个 statsDClient 对象实例,并在整个应用程序中使用它。我正在尝试以下内容:

import com.timgroup.statsd.NonBlockingStatsDClient;
import com.timgroup.statsd.StatsDClient;

Public class Helper(){

private static final StatsDClient statsDClient = new NonBlockingStatsDClient("prefix", "localhost", 8125);
private Helper(){}
 public static StatsDClient getInstance() {
      return statsDClient;
    }
}

稍后在我的控制器中,我通过以下方式获取 statsDClient 对象:

public class HelpController extends AbstractController {
private StatsDClient statsDClient = Helper.getInstance();
protected ModelAndView handleRequestInternal(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
statsDClient.someMethod();
}

但是,这似乎是在创建一个新的 statsDClient 对象,我在不同的控制器中使用它。你能指导我哪里出错了吗?

【问题讨论】:

  • 正确实现单例
  • 注册为bean并注入即可。
  • 这是 Spring bean 的正常模式(单例模式)。只需将其设为 Spring bean,一切都会自动为您工作。请注意,您似乎在使用 ancient 教程,因为我个人使用 Spring 已有 10 年了,从未编写过使用 AbstractController 的控制器,您通常 i> 想直接使用 Spring Boot Micrometer 工具而不是 statsd。

标签: java spring spring-mvc singleton statsd


【解决方案1】:

标记为静态的变量仅在内存中创建一次。您可以创建一个 bean 并将其注入到您需要的任何位置。

【讨论】:

  • 需要直接创建Helper类的bean还是NonBlockingStatsDClient类的bean?
  • 其实两者都可以,但是这种情况下,可以创建一个NonBlockingStatsDClient的bean。
【解决方案2】:

spring 中的 Beans 默认是单例的,这意味着只有一个共享实例被创建并由 spring 容器在整个应用程序中管理。

所以在您的情况下,您不需要将 statsDClient 指定为单个实例,

你可以做类似的事情 确保 statsDClient 只会被实例化一次 但这只是多余的

请参考https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htmlsingle/#beans-factory-scopes-singleton以便更好地理解

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2014-12-02
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多