服务层类应该是单例吗?

时间:2010-01-31 19:29:57

标签: spring n-tier-architecture

我正在使用Spring框架。我的服务类应该创建为单身吗?有人可以解释为什么或为什么不解释?谢谢!

4 个答案:

答案 0 :(得分:35)

是的,它们应该是范围singleton。 服务应该是无状态的,因此它们不需要多个实例。

因此,在范围singleton中定义它们可以节省实例化和连接它们的时间。

singleton是spring中的默认范围,因此只需保留bean定义,而不显式指定scope属性。

您可以阅读有关范围in the spring docs的更多信息。

答案 1 :(得分:2)

如果你坚持使用单例范围的bean,Spring会更容易使用。如果你愿意,单身人士是其“默认职位”。是的,它支持其他范围(在XML文件中使用scope="xyz"),但它使得使用起来更加困难并且会损害性能。

基本上,除非你有充分的理由不这样做,否则坚持单身。

答案 2 :(得分:1)

你需要大多数单身人士。 (Spring默认。)单例必须是线程安全的,因为并行请求将使用相同的单个实例。事实上,它们必须完全无国籍,因为它可以随时被破坏和重建。

如果你需要跟踪bean内部的状态(你不应该,这应该在数据库中或存储在请求中),你将获得相同类型的bean的许多实例,内存使用量上升请求的数量,通过单身人士,您仍然只有一个实例。

即使您将bean范围限定为请求,它们仍然必须至少是线程安全的(同时来自同一浏览器的请求)。

答案 3 :(得分:0)

服务层应为Singleton,否则对于每个传入请求,将创建一个新对象,这些对象很重,其中包含业务逻辑和许多代码行。他们必须是Singleton。