Java Spring@Repository最佳实践
上下文:Web应用程序 我以前没有使用过Spring,但是根据Spring文档,所有bean都是Java Spring@Repository最佳实践,java,multithreading,spring,spring-mvc,Java,Multithreading,Spring,Spring Mvc,上下文:Web应用程序 我以前没有使用过Spring,但是根据Spring文档,所有bean都是单例的,除非我们声明它们为原型 不使用弹簧: 通常,当有对业务/服务层的调用时,我会实例化新的DAO。 如果它是RESTfull服务,我将实例化几乎所有依赖于调用的对象 带弹簧: 我可以用@Repository注释数据访问类,也可以对服务层类使用@Service 因此,默认情况下,带有上述注释的类是singleton。 有一个@Scope注释,我们可以将它们声明为原型,但似乎没有人这样做 没
单例的
,除非我们声明它们为原型
- 不使用弹簧:
- 带弹簧:
@Repository
注释数据访问类,也可以对服务层类使用@Service
因此,默认情况下,带有上述注释的类是singleton
。
有一个@Scope
注释,我们可以将它们声明为原型,但似乎没有人这样做
- 没有弹簧:
newobject()代码>每次
- 带弹簧:
singleton
@Repository
是singleton
,那么当没有解决这样的问题时,它如何处理线程安全?(假设它是由spring代理完成的)@Repository
就足够了,还是添加@Scope('prototype')
更好@Scope('prototype')
与@Repository
一起使用(根据教程、博客等)。有一个众所周知的原因吗Spring不会为您处理并发问题。这不是故意的。它所做的只是让您控制创建实例的数量,以便您的应用程序能够正常工作 单例作用域(显而易见)将只创建给定bean的一个实例,并将其传递给所有依赖对象 每个依赖对象的原型范围将创建自己的实例,而不是在其他对象之间共享 对于DAO对象,不太可能需要多个实例来与数据库通信。所以通常使用单例。你是对的,在春天的世界里,大多数bean都是单例的
在这里,singleton比为每个请求创建一个新对象要好。只需避免冗余同步,这样您的线程就不会在某些监视器上阻塞使用@Repository注释的组件应该是单例的,因为它在整个生命周期中不会有多个/不同的状态。是,它可以保持的唯一状态是连接对象,它将在创建对象期间只设置一次。它将包含与数据存储对话的逻辑/方法,每个方法将获取/返回所需的数据对象。因此,不需要有多个存储库实例。非常感谢您给出了清晰的答案。你说的“避免冗余同步”到底是什么意思?我没有在DAO中定义任何同步方法或块。