Spring @Repository最佳做法

上下文:Web应用程序

我以前没有使用过Spring,但是根据Spring文档,所有bean都是singleton,除非我们将它们声明为prototype

  • 不使用Spring:

通常,当有业务/服务层调用时,我会实例化新的DAO。如果它是RESTfull服务,则几乎实例化所有依赖于调用的对象。

  • 与Spring:

我可以使用注释数据访问类,@Repository也可以@Service用于服务层类。

因此,带有上述批注的我的类是singleton默认的。有一个@Scope注释,我们可以将它们声明为原型, 但是似乎没有人这样做

  • 没有Spring:new Object();每次
  • 与Spring: singleton

我的问题是

  1. 我以前使用的方式(每次创建新实例)都不正确?
  2. 如果@Repositorysingleton,那么在没有解决此类问题时如何处理线程安全?(假设它是由spring代理完成的)
  3. 最佳实践@Repository是什么, 足够或添加@Scope('prototype')会更好?
  4. 我没有看到任何人使用@Scope('prototype')@Repository(根据教程,博客等)。有众所周知的原因吗?
  5. 如果我的DAO类被多个非常高频率的线程访问,该怎么办?(这是我最关心的那个)

谢谢

回答:

您是正确的-在 Spring World中,大多数bean是单例的。

  1. 我以前使用的方式(每次创建新实例)都不正确?

这是不正确的,因为它可以工作。问题在于,您在每个请求上实例化一个DAO的新实例-在某些情况下可能会很昂贵,而且无论如何它都没有任何意义-

为什么您需要一堆DAO实例?另一方面,Spring不仅会创建一个单例对象,而且还会将DAO注入服务或其他DAO的etcie中,从而为您完成了很多工作

  1. 如果@Repository是singleton,那么在没有解决此类问题时,它将如何处理线程安全性?(假设它是由spring代理完成的)

在编写@Repository bean时,通常会在其中注入 DataSourceEntityManager

。DataSource.getConnection()方法应该是线程安全的。对于 EntityManagerSpring

将注入一个代理,该代理对于不同的线程的行为将有所不同,即不同的线程不会共享同一JPA会话。

  1. 最佳实践是什么,@Repository足够还是添加@Scope(’prototype’)会更好?

最佳实践(或者说是最广泛使用的方法)是仅使用@Repository

  1. 我看不到有人将@Scope(’prototype’)与@Repository结合使用(根据教程,博客等)。有众所周知的原因吗?

原因是创建@Repository Bean的多个实例没有任何好处

  1. 如果我的DAO类被多个非常高频率的线程访问,该怎么办?(这是我最关心的那个)

同样,这里的singleton比为每个请求创建一个新对象更好。只是避免冗余同步,这样您的线程就不会在某些监视器上阻塞

以上是 Spring @Repository最佳做法 的全部内容, 来源链接: utcz.com/qa/425757.html

回到顶部