如果单身不好!! 为什么春豆是默认单线

Nir*_*iru 2 java spring

单身人士有什么不好的?

已经清楚地解释了Singleton设计模式违反了多个最佳实践.那么为什么Spring beans默认是单身?这种设计是否间接导致相同的违规行为?

Jen*_*der 12

单例模式和弹簧单例几乎没有共同之处.实际上唯一的可能是:

生产中只有一个运行时实例

让我们通过你所链接答案的模式评论:

它们通常用作全局实例,为什么这么糟糕?因为您在代码中隐藏了应用程序的依赖关系,而不是通过接口公开它们.制作一些全局的东西以避免传递它是一种代码味道.

对于Spring,你正在做相反的事情.你只是说:"我需要其中一个,而不关心它来自哪里."

他们违反了单一责任原则:由于他们控制着自己的创造和生命周期.

再说一遍:Spring完全相反:你编写一个普通的pojo,然后在Spring配置中配置它应该具有的生命周期.

它们固有地导致代码紧密耦合.在许多情况下,这使得将它们伪装在测试中相当困难.

使用Spring,没有什么能阻止您为每个测试使用不同的实例.

它们在应用程序的生命周期中处于状态.测试的另一个打击因为你可能最终会遇到需要订购测试的情况,这对于单元测试来说是一个很大的问题.为什么?因为每个单元测试应该独立于另一个.

是的,它们可以在应用程序的生命周期中携带状态,但由于您可以选择更改测试中的生命周期或实现(或应用程序的不同实例),因此测试保持彼此独立.

所有这些并不是特定于Spring的,但对于所有成熟的依赖注入框架来说都是如此,即使您选择手动执行它也是如此.


gal*_*ben 5

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 不是设计模式的单例。