我正在尝试使用Spring注释来创建一个导入配置的应用程序。对于这个问题,我将其缩小为两个文件。 Startup类:
package core;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Slf4j
@Configuration
@Import(ConfigSettings.class)
public class Startup {
public static void main (String args[]) {
log.info("main class");
}
}
和ConfigSettings包核心;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Slf4j
@Configuration
@ComponentScan({"connections", "filter"})
@PropertySource({"classpath:config/${env.config:dev}.application.properties"})
public class ConfigSettings {
public ConfigSettings() {
log.info("Constructor ConfigSettings");
}
}
我期望结果如下:
[INFO]Constructor ConfigSettings
[INFO]main class
但它只显示了主类。看起来配置设置的构造函数根本没有被调用。我希望它因为导入注释而调用它。
谁能解释出了什么问题?先感谢您!
你最好的办法是让config类返回包含你的值的配置对象。通常我不倾向于添加一个包罗万象的配置对象,但是每个组件(数据库,控制器等等)都有一个配置文件。
然后,您可以将配置的对象作为bean返回,让spring注入它。如果我要为RestTemplate创建一个配置文件(作为一个简单的例子):
@Service
public class RestClientConfig {
@Value("${your.config.value}")
private String yourValue;
private final RestTemplate restTemplate = new RestTemplate();
@Bean
public RestTemplate restTemplate() {
// Configure it, using your imported values
// ...
return restTemplate;
}
}
但是,main
方法位于spring容器之外,您将无法以这种方式引导它,但使用上述方法,您可以直接在需要使用它的位置调用已配置的组件。