我正在尝试制作一个使用Spring批注导入配置的应用程序。对于这个问题,我将其缩小为两个文件。启动类:
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设置的构造函数。由于导入批注,我希望它能调用它。
谁能解释出什么问题了?预先谢谢你!
答案 0 :(得分:2)
您最好的选择是使config类返回包含您的值的config对象。通常,我不倾向于添加一个包含所有内容的配置对象,但是每个组件(数据库,控制器等)都有一个配置文件。
然后,您可以将已配置的对象作为Bean返回,并让它弹簧注入。如果要为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容器之外,您将无法以这种方式进行引导,但是使用上述方法,您可以在需要使用它的地方直接调用已配置的组件。