繁体   English   中英

Spring Boot:自动装配注释的顺序有时会导致循环引用

[英]Spring Boot: order of Autowired annotation leads sometimes to circular references

我有一个带有多个Components和Configuration类的Spring Boot项目。 在我的项目中,我注意到自动装配字段的顺序导致了不同的情况。 有时我会收到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。 但是这些选项对于我的简单示例来说效果很好,但是它们会降低我更复杂的代码中的可读性。

我不了解有关此问题的以下问题:

  • 为什么Spring无法找到创建bean的正确顺序?
  • 我一般如何构造多个Configuration类和Components
  • 如何构造配置以避免与自动装配顺序有关的问题?

Bean之间的引用/依赖关系:

在此处输入图片说明

(橙色表示自动接线,黄色表示豆子,白色表示组件)

一件简单的事情就是将这个@Bean分成不同的Configuration类,如下所示

@Configuration
public class ApplicationConfig{

 @Autowired
 WebClient webClient;


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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM