【问题标题】:What is the correct @Scope for Components in Spring Boot desktop/CLI applications?Spring Boot 桌面/CLI 应用程序中组件的正确@Scope 是什么?
【发布时间】:2016-05-31 09:48:21
【问题描述】:

我已经编写了几个 Spring Boot 应用程序(目前,一个用于 Web,一个使用 JavaFX 和一些 CLI 应用程序)。 尽管一切都按预期工作,但我目前正在为桌面或命令行应用程序的一个特定概念而苦恼:@Services 和 @Component@Scope 注释强>s。

我最近阅读了很多为什么单例是“邪恶的”或至少是不受欢迎的,但对于桌面应用程序,我目前看不到其他方法来实现它,因为大多数时候单个实例在这些类型的应用程序中就足够了。

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

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

问候, 丹尼尔

【问题讨论】:

  • 单身并不邪恶,单身模式是邪恶的,但它们是不同的东西。不将事情单例化并将所有内容都设置为请求/会话范围甚至会使事情复杂化并使事情变得更加内存密集且性能更低。
  • 更准确地说:静态单例模式是邪恶的,因为它使代码难以测试等。这并不意味着单例总是邪恶的并且应该避免. Spring 单例 bean 没有任何问题。
  • 所以总结一下:我在使用单例范围注释服务方面没有做错任何事情。但如果我使用旧的单例模式,我会的。正确的?好的。也许那时有人可以做一个“真正的”答案(从 StackOverflow 的角度来看),我会投票并勾选它是正确的。其他偶然发现这一点的人会知道,什么是正确的,而无需阅读每条评论。提前致谢!

标签: java spring scope spring-boot desktop-application


【解决方案1】:

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

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

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

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

【讨论】:

  • 正如前面cmets所讨论的,我布斯理解并接受这一点。我只是不确定,因为我对所有这些文章都感到困惑。谢谢大家花时间为我澄清这件事!
猜你喜欢
  • 2019-08-06
  • 2019-03-22
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多