已经清楚地解释了Singleton设计模式违反了多个最佳实践.那么为什么Spring beans默认是单身?这种设计是否间接导致相同的违规行为?
Jen*_*der 12
单例模式和弹簧单例几乎没有共同之处.实际上唯一的可能是:
生产中只有一个运行时实例
让我们通过你所链接答案的模式评论:
它们通常用作全局实例,为什么这么糟糕?因为您在代码中隐藏了应用程序的依赖关系,而不是通过接口公开它们.制作一些全局的东西以避免传递它是一种代码味道.
对于Spring,你正在做相反的事情.你只是说:"我需要其中一个,而不关心它来自哪里."
他们违反了单一责任原则:由于他们控制着自己的创造和生命周期.
再说一遍:Spring完全相反:你编写一个普通的pojo,然后在Spring配置中配置它应该具有的生命周期.
它们固有地导致代码紧密耦合.在许多情况下,这使得将它们伪装在测试中相当困难.
使用Spring,没有什么能阻止您为每个测试使用不同的实例.
它们在应用程序的生命周期中处于状态.测试的另一个打击因为你可能最终会遇到需要订购测试的情况,这对于单元测试来说是一个很大的问题.为什么?因为每个单元测试应该独立于另一个.
是的,它们可以在应用程序的生命周期中携带状态,但由于您可以选择更改测试中的生命周期或实现(或应用程序的不同实例),因此测试保持彼此独立.
所有这些并不是特定于Spring的,但对于所有成熟的依赖注入框架来说都是如此,即使您选择手动执行它也是如此.
Spring Singletons 并不是我们从 GOF 设计模式中知道的真正的 Singletons。它们给你那种感觉,因为 IoC 容器(Bean Factory)只有一个 bean。
这意味着您可以实例化一个为它创建的单例 bean 的类。
您还可以拥有 2 个来自同一类的单例 bean。
因此,“奇点”存在于 bean 工厂中 bean 的概念中,而不是一个类。
例子:
@Configuration
public class AppConfig {
@Bean(name = "a")
public MyBeanClass a() {
return new MyBeanClass();
}
@Bean(name = "b")
public MyBeanClass b() {
return new MyBeanClass();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您将拥有 2 个 MyBeanClass 类的单例 bean。而且 MyBeanClass 不是设计模式的单例。
| 归档时间: |
|
| 查看次数: |
1742 次 |
| 最近记录: |