假设我有以下依赖项:
@Configuration
public class MyCfg {
// ...
@Bean
public Session session() {
return sessionFactory().getCurrentSession();
}
}
@Repository
@Transactional
public class MyRepo {
@Autowired
private Session session;
}
sessionFactory()
设置正确。如果我注入SessionFactory
而不是Session
,它就可以了。但是,如果尝试并注入Session
,它会因容器引导程序中的异常而死亡,因为没有绑定到线程的会话。
由于存储库是@Transactional
,我知道在运行时会有一个会话。我怎样才能使它工作,以便它在运行时注入AOP初始化的Session
,但在实例化repo时不尝试解决它?
答案 0 :(得分:2)
我会看一下Spring documentation regarding bean scopes的这一点。在底部附近,它们显示了如何使用@Scope
注释,您希望将其应用于session()
中的MyCfg
方法。听起来你会想要使用'request'值,它将为每个进入的HTTP请求创建这个bean的新实例。
我还建议您查看<aop:scoped-proxy/>
元素以进行配置。在文档中提到了几次,可能对您要做的事情有用。
答案 1 :(得分:0)
这种方法会给你带来很多麻烦。您应该注入Session
,而不是注入SessionFactory
,而您现在自动将其作为单例范围。在Session
带注释的方法中获取的@Transactional
实例将遵循这些事务规则,例如:
@Transactional(readonly=true)
public List<Person> getPersons() {
Session session = sessionFactory.getCurrentSession();
//find those darn people.
}
@Autowired
private SessionFactory sessionFactory;