首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Repository最佳实践

Spring @Repository最佳实践
EN

Stack Overflow用户
提问于 2015-01-20 07:33:28
回答 4查看 21.2K关注 0票数 37

上下文: Web应用程序

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

  • 不使用Spring:

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

  • 与Spring:

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

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

  • 没有Spring :每次都是new Object();
  • 使用Spring:singleton

我的问题是,

  1. 我以前使用的方式(每次创建新实例)是不正确的?
  2. 如果@Repositorysingleton,那么当没有这样的问题时,它如何处理线程安全呢?(假设它是由春季代理完成的)
  3. 什么是最佳实践,@Repository就足够了,或者添加@Scope('prototype')会更好?
  4. 我没有看到任何人在@Repository中使用@Repository(根据教程、博客等)。有什么很清楚的原因吗?
  5. 如果我的DAO类被多个非常高频率的线程访问了呢?(这是我最关心的问题)

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-20 08:01:52

你说得对--在春天的世界里,大多数豆子都是单身汉。

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

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

  1. 如果@Repository是单例,那么如果没有这样的解决方案,它如何处理线程安全?(假设它是由春季代理完成的)

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

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

最佳实践(或者说是一种最广泛的方法)是只使用@Repository。

  1. 我没有看到任何人在@Repository中使用@Scope('prototype') (根据教程、博客等)。有什么很清楚的原因吗?

原因是创建多个@Repository实例是没有利润的

  1. 如果我的DAO类被多个非常高频率的线程访问了呢?(这是我最关心的问题)

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

票数 32
EN

Stack Overflow用户

发布于 2015-01-20 07:57:42

  1. 不是,但是单元测试要困难得多,这就是依赖注入的意义所在。通过在服务中注入DAO,您可以在测试期间通过注入模拟DAO轻松地对服务进行单元测试。如果服务创建了自己的DAO,这是不可能的。
  2. 存储库通常是完全无状态的,除非在启动时初始化了线程安全的实体管理器、会话工厂或JDBC模板,因此并发调用不是问题:它是线程安全的。
  3. 存储库没有理由成为原型。将原型DAO注入单例服务仍然会导致同时调用每个原型。
  4. 没有理由这么做。
  5. 没问题:如果编码正确,它应该是线程安全的。
票数 3
EN

Stack Overflow用户

发布于 2015-01-20 07:58:10

Spring不会为您处理并发问题。这不是故意的。它所做的就是让您控制创建实例的数量,以便您的应用程序能够正常工作。

Singleton作用域(显而易见)将只创建给定bean的一个实例,并将其传递给所有依赖对象。

每个依赖对象的原型作用域将创建自己的实例,而不是在其他对象之间共享。

对于DAO对象,您不太可能需要多个实例来与数据库通信。所以单例通常都是用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28039901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档