如何在整个 Spring MVC Web 应用程序中创建对象的单个实例?

How to create a single instance of object across entire Spring MVC web application?

我有一个 Spring MVC 网络应用程序(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 中的 Beans 默认是单例的,这意味着在整个应用程序中,spring 容器只会创建并管理一个共享实例。

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

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

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