Spring Boot:Autowired注释的顺序有时会导致循环引用

时间:2016-05-12 21:42:37

标签: java spring spring-boot autowired

我有一个包含多个组件和配置类的Spring Boot项目。在我的项目中,我注意到Autowired字段的顺序会导致不同的场景。有时我会得到Nullpointer-Exceptions,Spring Boot会抱怨循环引用,但是如果字段顺序合适,一切正常。

我能够通过这个简单的代码片段重现我的问题:

的Component1:

@Component
public class Properties {

    public String getHost() {
        return "some.address.com";
    }
    public int getPort() {
        return 8080;
    }
}

COMPONENT2:

@Component
public class WebClient {

    @Autowired
    String webadress;

    public void callWebAdress() {
        System.out.println("Getting Data from " + webadress);
    }
}

应用:

@SpringBootApplication
public class Application {

    @Autowired
    WebClient webClient;

    @Autowired
    Properties props;

    @Bean
    String webAdresss(){
        return "http://+"+props.getHost()+":"+props.getPort();
    }

    @PostConstruct
    void init (){
        webClient.callWebAdress();
    }

    public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
    }
}

此配置现在导致循环引用问题。但是,当我在Application类中更改字段webClientprops的顺序时,一切正常。我知道有几个其他选项可以让代码运行,例如将属性自动装配为方法参数,在WebClient中自动装配属性Bean。但这些选项对我的简单示例工作正常,但它们会降低我更复杂代码的易读性。

我不明白这个问题:

  • 为什么春天无法找到创建豆子的正确顺序?
  • 如何构建多个Configuration类和Components一般?
  • 如何构建配置以避免有关自动装配订单的问题?

bean的引用/依赖关系:

enter image description here

(橙色表示自动装配,黄色表示豆白色表示组件)

1 个答案:

答案 0 :(得分:0)

一件简单的事情就是将此@Bean分成不同的配置类,如下所示

@Configuration
public class ApplicationConfig{

 @Autowired
 WebClient webClient;


 @Bean
 String webAdresss(){
        return "http://+"+props.getHost()+":"+props.getPort();
 }

}