Spring @Repository最佳做法
上下文:Web应用程序
我以前没有使用过Spring,但是根据Spring文档,所有bean都是singleton
,除非我们将它们声明为prototype
。
- 不使用Spring:
通常,当有业务/服务层调用时,我会实例化新的DAO。如果它是RESTfull服务,则几乎实例化所有依赖于调用的对象。
- 与Spring:
我可以使用注释数据访问类,@Repository
也可以@Service
用于服务层类。
因此,带有上述批注的我的类是singleton
默认的。有一个@Scope
注释,我们可以将它们声明为原型, 但是似乎没有人这样做 。
- 没有Spring:
new Object();
每次 - 与Spring:
singleton
我的问题是
- 我以前使用的方式(每次创建新实例)都不正确?
- 如果
@Repository
是singleton
,那么在没有解决此类问题时如何处理线程安全?(假设它是由spring代理完成的) - 最佳实践
@Repository
是什么, 足够或添加@Scope('prototype')
会更好? - 我没有看到任何人使用
@Scope('prototype')
它@Repository
(根据教程,博客等)。有众所周知的原因吗? - 如果我的DAO类被多个非常高频率的线程访问,该怎么办?(这是我最关心的那个)
谢谢
回答:
您是正确的-在 Spring World中,大多数bean是单例的。
- 我以前使用的方式(每次创建新实例)都不正确?
这是不正确的,因为它可以工作。问题在于,您在每个请求上实例化一个DAO的新实例-在某些情况下可能会很昂贵,而且无论如何它都没有任何意义-
为什么您需要一堆DAO实例?另一方面,Spring不仅会创建一个单例对象,而且还会将DAO注入服务或其他DAO的etcie中,从而为您完成了很多工作
- 如果@Repository是singleton,那么在没有解决此类问题时,它将如何处理线程安全性?(假设它是由spring代理完成的)
在编写@Repository bean时,通常会在其中注入 DataSource 或 EntityManager
。DataSource.getConnection()方法应该是线程安全的。对于 EntityManager , Spring
将注入一个代理,该代理对于不同的线程的行为将有所不同,即不同的线程不会共享同一JPA会话。
- 最佳实践是什么,@Repository足够还是添加@Scope(’prototype’)会更好?
最佳实践(或者说是最广泛使用的方法)是仅使用@Repository
- 我看不到有人将@Scope(’prototype’)与@Repository结合使用(根据教程,博客等)。有众所周知的原因吗?
原因是创建@Repository Bean的多个实例没有任何好处
- 如果我的DAO类被多个非常高频率的线程访问,该怎么办?(这是我最关心的那个)
同样,这里的singleton比为每个请求创建一个新对象更好。只是避免冗余同步,这样您的线程就不会在某些监视器上阻塞
以上是 Spring @Repository最佳做法 的全部内容, 来源链接: utcz.com/qa/425757.html