Java 如何在整个SpringMVCWeb应用程序中创建单个对象实例?

Java 如何在整个SpringMVCWeb应用程序中创建单个对象实例?,java,spring,spring-mvc,singleton,statsd,Java,Spring,Spring Mvc,Singleton,Statsd,我有一个SpringMVCWeb应用程序(基于XML,没有注释)。我只想在应用程序启动时创建一个statsDClient对象的实例,并在整个应用程序中使用它。我正在尝试以下内容: import com.timgroup.statsd.NonBlockingStatsDClient; import com.timgroup.statsd.StatsDClient; Public class Helper(){ private static final StatsDClient statsDCl

我有一个SpringMVCWeb应用程序(基于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对象,我在不同的控制器中使用它。您能告诉我哪里出错了吗?

标记为static的变量在内存中只创建了一次。您可以创建一个bean并将其注入到任何需要的地方。

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

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

你可以这样做 为了确保statsDClient只实例化一次 但这只是多余的


请参阅以便更好地理解

正确实现Singleton只需将其注册为bean并注入即可。这是SpringBean的正常模式(Singleton模式)。只要让它成为一个SpringBean,一切都会自动为您工作。请注意,您似乎正在使用一个古老的教程,因为我个人使用Spring已经10年了,而且从未编写过使用
AbstractController
的控制器,您通常希望使用Spring Boot测微计工具而不是直接使用statsd。我是否需要直接创建一个bean of Helper类或NonBlockingStatsClient类?实际上,您可以同时创建这两个类,但在这种情况下,您可以创建一个bean of NonBlockingStatsClient。