1 问题描述
写了一个组件,内部使用 @Component 与 @ConfigurationProperties 注解来读取 yml 格式的配置文件。因为需要一些初始化操作,所以实现了 CommandLineRunner 接口,并在 run() 方法来进行初始化工作。
@Component
@ConfigurationProperties(prefix = "xxx")
public class DatasourceMapperConfig implements CommandLineRunner {
…
@Override
public void run(String... args) throws Exception {
setDSGroupNames();
setDSNames();
valid();
log.debug("configs -> {}", configs);
}
…
}
当把这个组件打成 jar,加载到 Spring Boot 框架中时,发现 CommandLineRunner 的 run() 并没有运行,所以初始化的值都是空的:
2 原因分析
因为这个类是被打包在组件中的,所以不会被自动扫描到。即使在 Spring Boot 启动类中使用 @Import注解导入这个类也无效。因为@Import注解只针对 @Component 注解有效。可惜没有发现Spring Boot对自动扫描区域外的 CommandLineRunner,有什么相关支持的注解。
3 问题解决
因为是配置类,所以 Spring 框架肯定会执行 set 方法,所以把之前的初始化代码段移放到 set 方法中。
public void setConfigs(List<DatasourceConfig> configs) {
this.configs = configs;
setDSGroupNames();
setDSNames();
valid();
log.debug("configs -> {}", configs);
}