【问题标题】:Spring - "late binding" autowired beansSpring - “后期绑定”自动装配 bean
【发布时间】:2011-08-03 13:26:57
【问题描述】:

假设我有以下依赖项:

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

【问题讨论】:

    标签: java hibernate spring dependency-injection


    【解决方案1】:

    我会看看Spring documentation regarding bean scopes 的这一点。在底部附近,他们展示了如何使用@Scope 注释,您将希望将其应用于MyCfg 中的session() 方法。听起来您想使用“请求”值,这将为每个传入的 HTTP 请求创建此 bean 的新实例。

    我还建议查看<aop:scoped-proxy/> 元素进行配置。它在文档中被多次提及,可能对您尝试做的事情有用。

    【讨论】:

    • 如果我每个请求有多个事务怎么办?
    • 我不完全确定,但在这种情况下您可能需要构建自定义范围。查看文档中的第 3.5.5 节,了解如何创建自定义“事务”范围。
    【解决方案2】:

    这种方法会给您带来很多麻烦。与其注入 Session(您现在会自动将其限定为单例),不如注入 SessionFactory。在@Transactional 注释方法中获取的Session 实例将遵守这些事务规则,例如:

    @Transactional(readonly=true)
    public List<Person> getPersons() {
      Session session = sessionFactory.getCurrentSession();
      //find those darn people.
    }
    @Autowired
    private SessionFactory sessionFactory; 
    

    【讨论】:

    • 我知道该怎么做,而这正是我想要避免的。我不希望有那么多工厂和样板在四处飘荡。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2012-12-04
    • 2020-09-09
    • 2018-06-15
    相关资源
    最近更新 更多