2016-05-12 119 views
2

我有一个包含多个组件和配置类的Spring Boot项目。在我的项目中,我注意到自动布线字段的顺序导致了不同的场景。有时我会得到Nullpointer-Exceptions,而Spring Boot正在抱怨循环引用,但是按照正确的顺序排列,一切正常。Spring Boot:Autowired注释的顺序有时会导致循环引用

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

的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); 
    } 
} 

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

我不明白,在这个问题这个问题:

  • 为什么春天不能够找出创建豆的正确顺序?
  • 一般我怎样才能构造多个Configuration类和Components
  • 如何构造配置以避免有关自动装配顺序的问题?

引用/豆的依赖关系相互:

enter image description here

(橙色装置自动连接,黄色表示豆和白色是指成分)

+0

您是否尝试过'@ ConfigurationProperties'。文档 - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties –

+0

你有没有尝试过@Bean String webAdress(属性道具){return“http:// +”+ props.getHost()+“:”+ props.getPort();}' –

+0

imho最大的缺陷是你试图做一个简单的属性('webAddress ')一个你最初不应该做的事。 –

回答

0

一个容易的事do将@Bean分为不同的配置类如下

@Configuration 
public class ApplicationConfig{ 

@Autowired 
WebClient webClient; 


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

}