您是正确的-在 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比为每个请求创建一个新对象更好。只是避免冗余同步,这样您的线程就不会在某些监视器上阻塞



