清楚地解释了单例设计模式违反了多个最佳实践。那么为什么Spring的bean默认是单例的呢?这种设计是否会间接导致相同的违规行为?
Spring单例并不是我们从GOF设计模式中所知道的真正的单例。它们给你这种感觉,因为IoC容器(Bean工厂)中只有一个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();
}
}
所以,您将拥有两个MyBeanClass类的单例bean。而MyBeanClass不是单例设计模式。
@Singleton
实际上遵循“只创建一个”的模式。另请参见http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne。对于这些bean,Java EE有更好的范围名称:@ApplicationScoped
。 - BalusC