Spring 框架的 CommandLineRunner 以组件形式发布后无法执行问题的解决方法

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 configs) {
        this.configs = configs;
        setDSGroupNames();
        setDSNames();
        valid();
        log.debug("configs -> {}", configs);
}

你可能感兴趣的:(Spring 框架的 CommandLineRunner 以组件形式发布后无法执行问题的解决方法)