Spring @Repository最佳实践

sur*_*a2k 30 java spring multithreading spring-mvc

上下文:Web应用程序

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

  • 不使用Spring:

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

  • 随着春天:

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

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

  • 没有春天:new Object();每一次
  • 随着春天: singleton

我的问题是,

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

谢谢

bed*_*rin 23

你是对的 - 在春天的世界里,大部分豆子都是单身人士.

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

这是不正确的,因为它的工作原理.它的问题是你在每个请求上实例化一个新的DAO实例 - 在某些情况下它可能很昂贵,而且无论如何它没有任何意义 - 为什么你需要一堆DAO实例?另一方面,Spring不仅创建了一个单例,而且还将DAO注入服务或其他DAO等等,为你做了很多工作

  1. 如果@Repository是单例,当没有这样的东西被解决时,它如何处理线程安全?(假设它由弹簧代理完成)

在编写@Repository bean时,通常会在那里注入一个DataSource或一个EntityManager.DataSource.getConnection()方法应该是线程安全的.关于EntityManager,Spring会注入一个代理,它对不同的线程会有不同的行为,即不同的线程不会共享相同的JPA会话.

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

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

  1. 我没有看到任何人将@Scope('prototype')与@Repository一起使用(根据教程,博客等).有一个众所周知的原因吗?

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

  1. 如果我的DAO类被多个大量高频率的线程访问怎么办?(这是我最关心的一个)

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