这是一个非常基本的问题但我需要帮助。假设我们在spring中创建一个单例bean,那么spring ioc将创建该特定bean的单个实例,并且当某些代码需要它时会被注入。这很好。但我对如何通过多线程环境进行管理感到困惑。就像我们在spring中将sesssionFactory bean作为单例生成,然后向需要sessionFactory bean的特定rest url发出许多请求。 spring框架如何将bean的单个实例提供给那么多请求。
答案 0 :(得分:4)
您是在谈论持久性提供商会话工厂,例如Hibernate SessionFactory?
这个工厂应该对每个DataSource都存在一次,因为它创建起来并不便宜(连接处理,内存消耗),并且绝对应该在整个应用程序生命周期中重复使用,因此在这一点上就可以使用单例。工厂是不可变的(线程安全的),并且不存在并发问题。
每个传入的线程(由Web请求创建)都应该重用此工厂来创建它自己的会话,并且无论访问多少次(例如存储在线程中),都应该将此会话用于此线程。线程局部变量)。
E.g。如果我们现在将抽象层提升到JPA级别,JPA EntityManagerFactory将包装Hibernate SessionFactory,如果你想将JPA链接用于Hibernate Session - EntityManager - 你想要让Spring管理它,你会得到一个像这样的EntityManager代理:
@PersistenceContext
private EntityManager entityManager;
这将为您的业务代码提供当前线程的EntityManager代理(包装的Session)。
如果您使用Spring Data JPA,它的存储库和@Transactional
方法,则同样适用于下一级抽象。在这种情况下,Spring也会为您处理。