上下文: Web应用程序
我以前没有使用过Spring,但是根据Spring,所有bean都是singleton,除非我们将它们声明为prototype。
通常,当调用业务/服务层时,我会实例化新的DAO。如果它是一个RESTfull服务,我实例化了几乎所有依赖于调用的对象。
我可以用@Repository注释数据访问类,也可以将@Service用于服务层类。
因此,默认情况下,具有上述注释的类是singleton。有一个@Scope注释,我们可以将它们声明为原型,但似乎没有人这样做。
new Object();singleton我的问题是,
@Repository是singleton,那么当没有这样的问题时,它如何处理线程安全呢?(假设它是由春季代理完成的)@Repository就足够了,或者添加@Scope('prototype')会更好?@Repository中使用@Repository(根据教程、博客等)。有什么很清楚的原因吗?谢谢
发布于 2015-01-20 08:01:52
你说得对--在春天的世界里,大多数豆子都是单身汉。
这并不是不正确的,因为它的工作。问题在于,您在每个请求上实例化了一个新的DAO实例--在某些情况下,它可能很昂贵,而且无论如何,它没有任何意义--您为什么需要一堆DAO实例?另一方面,Spring不仅创建一个单例,而且还将DAO注入到服务或其他DAO的e.t.c。也就是为你做了很多工作
在编写@Repository时,通常会在那里注入一个DataSource或EntityManager。DataSource.getConnection()方法应该是线程安全的。关于EntityManager,Spring将注入一个代理,该代理对于不同的线程将有不同的行为,也就是说,不同的线程不会共享相同的JPA会话。
最佳实践(或者说是一种最广泛的方法)是只使用@Repository。
原因是创建多个@Repository实例是没有利润的
同样,在这里,单例比为每个请求创建一个新对象更好。只需避免冗余的同步,这样线程就不会在某些监视器上阻塞
发布于 2015-01-20 07:57:42
发布于 2015-01-20 07:58:10
Spring不会为您处理并发问题。这不是故意的。它所做的就是让您控制创建实例的数量,以便您的应用程序能够正常工作。
Singleton作用域(显而易见)将只创建给定bean的一个实例,并将其传递给所有依赖对象。
每个依赖对象的原型作用域将创建自己的实例,而不是在其他对象之间共享。
对于DAO对象,您不太可能需要多个实例来与数据库通信。所以单例通常都是用的。
https://stackoverflow.com/questions/28039901
复制相似问题