为什么Spring bean是单例范围?

时间:2014-02-17 12:06:16

标签: spring

我正在与Hibernet和Spring合作,这很好......但我有些怀疑

1)为什么弹簧范围默认为单身?是否有任何理由

2)我可以在Hibernate实体中编写final varible吗?   示例:

@Entity
public class Emp {
  @Id
  private Long id;
  final private String panNo;
}

我可以像上面这样写吗

3)静态变量可以Searlizable?

2 个答案:

答案 0 :(得分:15)

如果你仔细观察Spring,你会发现Spring可以帮助你编写服务,而不是数据对象。使用Spring,您仍然需要管理自己的域对象,可能是关系数据对象或直接POJO,并将它们作为输入传递给Spring托管服务,存储库和控制器等。

因此,考虑到这一点,应该清楚为什么Spring的默认范围不是原型,会话或请求:每次请求进入时我们都不需要创建新服务。但为什么单身?当服务是无状态的时,它是线程安全的,并且它可以扩展到任意数量的并发请求,因此不需要同一服务的第二个副本。

与EJB,有状态和无状态bean不同,Spring只有一种类型的bean:无状态。如果你想管理国家,你必须自己做。就像之前的回答已经指出的那样,无状态是迄今为止更好的选择,因为它更快,更可扩展,更易于维护,它也是REST架构所倡导的。有状态的豆子在纸面上可能看起来很棒,多年来它已被证明是一场灾难。

答案 1 :(得分:9)

无状态bean规则:)如果你不打算在bean中保存状态数据,那么每个bean只有一个实例就足够了。你还应该记住,这不是JVM单身人士 - 只是春天的单身人士。因此,您不必仅提供私有构造函数和任何getInstance()方法。

引用Spring文档:

  

当bean是单例时,只有一个bean的共享实例   管理和所有与id或id匹配的bean的请求   bean定义将导致一个特定的bean实例   返回。

只有当您必须保留一些会话详细信息时,才应使用例如会话范围。