我有一个包含多个组件和配置类的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类中更改字段webClient
和props
的顺序时,一切正常。我知道有几个其他选项可以让代码运行,例如将属性自动装配为方法参数,在WebClient中自动装配属性Bean。但这些选项对我的简单示例工作正常,但它们会降低我更复杂代码的易读性。
我不明白这个问题:
Configuration
类和Components
一般?bean的引用/依赖关系:
(橙色表示自动装配,黄色表示豆白色表示组件)
答案 0 :(得分:0)
一件简单的事情就是将此@Bean
分成不同的配置类,如下所示
@Configuration
public class ApplicationConfig{
@Autowired
WebClient webClient;
@Bean
String webAdresss(){
return "http://+"+props.getHost()+":"+props.getPort();
}
}