我正在与Hibernet和Spring合作,这很好......但我有些怀疑
1)为什么弹簧范围默认为单身?是否有任何理由
2)我可以在Hibernate实体中编写final varible吗? 示例:
@Entity
public class Emp {
@Id
private Long id;
final private String panNo;
}
我可以像上面这样写吗
3)静态变量可以Searlizable?
答案 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实例 返回。
只有当您必须保留一些会话详细信息时,才应使用例如会话范围。