春天 - “后期绑定”自动装豆

时间:2011-08-03 13:26:57

标签: java hibernate spring dependency-injection

假设我有以下依赖项:

@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时不尝试解决它?

2 个答案:

答案 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;