2016-05-12 2 views
2

У меня есть проект Spring Boot с несколькими классами компонентов и конфигурации. В моем проекте я заметил, что порядок полей Autwired приводит к различным сценариям. Иногда я получаю 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); 
    } 
} 

Это CONFI guration теперь приводит к круговой справочной проблеме. Однако, когда я изменяю порядок полей webClient и props в моем классе приложений, все работает нормально. Я знаю, что есть несколько других вариантов для запуска кода, например. автоувеличивание свойств в качестве параметра метода, автообновление свойств Bean в WebClient. Но это параметры, которые отлично подходят для моего простого примера, но они уменьшат удобочитаемость в моем более сложном коде.

Я не понимаю, это вопросы, касающиеся этого вопроса:

  • Почему весной не удалось выяснить, правильный порядок создания бобов?
  • Как я могу структурировать несколько классов Configuration и Components в целом?
  • Как я могу структурировать конфигурацию, чтобы избежать проблем, связанных с порядком автопостановки?

ссылки/зависимостями бобах друг к другу:

enter image description here

(оранжевые средства autowired, желтый означает фасоль и белый означает компонент)

+0

Вы пробовали '@ ConfigurationProperties'. Doc - 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 ') bean, который imho вы не должны делать в первую очередь. –

ответ

0

Одна легкая вещь do является отдельным этим @Bean в differen Конфигурация класс ниже

@Configuration 
public class ApplicationConfig{ 

@Autowired 
WebClient webClient; 


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

}