【发布时间】:2011-01-11 11:52:18
【问题描述】:
我正在使用 Spring 框架。我的服务类应该创建为单例吗?有人可以解释为什么或为什么不?谢谢!
【问题讨论】:
标签: spring n-tier-architecture
我正在使用 Spring 框架。我的服务类应该创建为单例吗?有人可以解释为什么或为什么不?谢谢!
【问题讨论】:
标签: spring n-tier-architecture
是的,它们应该在singleton 范围内。
服务应该是无状态的,因此它们不需要多个实例。
因此在singleton 范围内定义它们将节省实例化和连接它们的时间。
singleton 是 spring 中的默认作用域,因此只需保持 bean 定义不变,无需显式指定 scope 属性。
您可以阅读有关范围的更多信息in the spring docs。
【讨论】:
如果您坚持使用单例范围的 bean,那么 Spring 会更容易使用。如果您愿意,单例是它的“默认位置”。是的,它支持其他作用域(在 XML 文件中使用 scope="xyz"),但它使事情更难使用并损害性能。
基本上,除非您有充分的理由不这样做,否则请坚持使用单例。
【讨论】:
您主要需要单身人士。 (Spring 默认。)单例必须是线程安全的,因为并行请求将使用相同的单个实例。事实上,它们必须是完全无状态的,因为它可以随时被销毁和重新创建。
如果您需要跟踪 bean 内部的状态(您不应该,这应该在数据库中或存储在请求中),您将获得许多相同类型 bean 的实例,内存使用量会随着请求的数量,因此对于单例,您仍然只有一个实例。
即使您将 bean 限定为请求,它们仍必须至少是线程安全的(请求同时来自同一浏览器)。
【讨论】:
Thready safety 是关于实现,而不是 bean 范围。单例类可能不是线程安全的,而原型类可能是线程安全的。
服务层应该是单例的,否则对于每个传入的请求都会创建一个新对象,这些对象很重,包含业务逻辑和大量代码行。他们必须是单身人士。
【讨论】: