Spring Boot desktop/CLI 应用程序中组件的正确@Scope 是什么?

What is the correct @Scope for Components in Spring Boot desktop/CLI applications?

我已经编写了几个 Spring Boot 应用程序(目前,一个用于网络,一个使用 JavaFX 和一些 CLI 应用程序)。 虽然所有工作都按预期进行,但我目前正在努力解决桌面或命令行应用程序的一个特定概念:@Scope 注释 @Services 和 @Components.

我最近读了很多为什么单例 "evil" 或至少不受欢迎的原因,但是对于桌面应用程序,我目前看不到其他实现它的方法,因为大多数时候单个实例就足够了各种应用程序。

Guice 中,我会在我的模块中创建一个(非静态和非最终)实例。在 Spring 我使用 @Scope("singleton").

我现在想知道的是:这是一个干净的解决方案吗?还有其他解决方案吗?

此致, 丹尼尔

您正在阅读的文章是关于单例模式的。许多人认为 Singleton 是一种反模式,并且有很多关于原因的信息。请参阅 this answer 以了解为什么应避免使用 模式 的一些充分理由。

你指的是作为作用域的单例。 Spring 不遵循该模式,单例范围仅表示 容器 将仅创建一个实例并使用它来满足依赖关系。可能有多个容器,每个容器都有自己的实例,或者一个容器中的 bean 是单例范围,而另一个容器是原型范围。

Singleton 是 默认范围 in Spring 所以你实际上不需要指定它。如果您没有特定原因 使用不同的作用域,那么您可能需要默认的单例。有时我需要一个 not 共享的 bean,在这种情况下我可能会使用 prototype。请 check the Spring documentation 了解有关可用范围及其含义的更多信息。

无论如何,这里的关键区别在于这不是单例模式的实现。如果 Spring 要实现这样的模式,那么我们希望每个容器都有 相同的实例 ,但事实并非如此。