У меня есть проект 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
в целом? - Как я могу структурировать конфигурацию, чтобы избежать проблем, связанных с порядком автопостановки?
ссылки/зависимостями бобах друг к другу:
(оранжевые средства autowired, желтый означает фасоль и белый означает компонент)
Вы пробовали '@ ConfigurationProperties'. Doc - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties –
Вы пробовали '@Bean String webAdress (Свойства реквизита) {return "http: // +" + props.getHost() + ":" + props.getPort();} ' –
imho самым большим недостатком является то, что вы пытаетесь создать простую собственность (' webAddress ') bean, который imho вы не должны делать в первую очередь. –