【问题标题】:Autowire a bean within Spring's Java configuration使用 Spring Java 配置自动装配 bean
【发布时间】:2015-02-26 16:33:23
【问题描述】:

是否可以在用 Java 编写的 Spring 配置中使用 Spring 的 @Autowired 注解?

例如:

@Configuration
public class SpringConfiguration{

   @Autowired 
   DataSource datasource;

   @Bean
   public DataSource dataSource(){
       return new dataSource();
   }

   // ...

}

显然 DataSource 接口不能直接实例化,但为了简化,我在这里直接实例化了它。目前,当我尝试上述方法时,数据源对象仍然为空,并且没有被 Spring 自动装配。

我通过返回FactoryBean<SessionFactory>@Autowired 成功地使用Hibernate SessionFactory 对象。

所以我的问题是:关于DataSource,有没有办法做到这一点?或者更一般地说,在 Spring Java 配置中自动装配 bean 的方法是什么?

我应该注意我使用的是 Spring 3.2 版。

【问题讨论】:

  • 你为什么需要在那里自动接线?
  • 我只是想将 xml 配置文件转换为 Java 配置文件。我想既然我可以在 xml 中通过 id 引用 bean,为什么我不应该在 Java 配置文件中使用 autowire 注释呢?

标签: java spring


【解决方案1】:

如果您需要在同一 @Configuration 文件中引用 DataSource bean,只需调用 bean 方法即可。

@Bean
public OtherBean someOtherBean() {
    return new OtherBean(dataSource());
}

或者让它自动装配到@Bean 方法中

@Bean
public OtherBean someOtherBean(DataSource dataSource) {
    return new OtherBean(dataSource);
}

@Configuration 类的生命周期有时会像您建议的那样阻止自动装配。

【讨论】:

  • 这很有趣,它的工作原理完全符合您的描述。这是为什么?你能指出我谈论这个确切问题的任何 Spring 文档吗?顺便非常感谢您的回答。
  • @Avanst 查看文档here
  • @SotiriosDelimanolis,今天我花了几个小时寻找将成员注入配置类引起的类似问题。
  • @heez DataSource 是一个接口 (java.sql.DataSource)。我不明白你的担心。
  • @SotiriosDelimanolis 评论中引用的文档的更新链接:docs.spring.io/spring/docs/current/spring-framework-reference/…
【解决方案2】:

也许你可以使用构造函数将其他配置文件中的一些bean注入到你的配置中,而@Autowired在配置文件中可能无法正常工作

@Configuration
public class AppConfig {
  private DataSource dataSource;

  public AppConfig(DataSource dataSource) {
    this.dataSource = dataSource;
  }

  @Bean
  public OtherBean otherBean(){
    return new OtherBean(dataSource);
  }
}

【讨论】:

    【解决方案3】:

    为了完整起见:是的,在 Spring @Configuration 类中使用 @Autowired 注释在技术上是可行的,并且它的工作方式与其他 spring bean 相同。但是接受的答案表明应该如何解决原始问题。

    【讨论】:

      【解决方案4】:

      使用@Configuration 类配置的bean 不能自动装配,

      所以你不能同时使用@Autowiring 和@configuration

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-09
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多