Spring-Boot 多模块项目加载属性文件

2022-09-02 01:48:02

我有一个Spring-Boot-Application作为maven中的多模块项目。结构如下:

Parent-Project
|--MainApplication
|--Module1
|--ModuleN

在项目中,有带批注的方法类,依此类推。与往常一样,此项目具有自动加载的 application.properties 文件。因此,我可以通过注释访问值MainApplicationmain()@SpringBootApplication@Value

@Value("${myapp.api-key}")
private String apiKey;

在我的 Module1 中,我还想使用一个属性文件(称为 module1.properties),其中存储了模块配置。此文件将仅在模块中访问和使用。但我无法加载它。我试过了,但没有运气。@Configuration@PropertySource

@Configuration
@PropertySource(value = "classpath:module1.properties")
public class ConfigClass {

如何使用Spring-Boot加载属性文件并轻松访问这些值?找不到有效的解决方案。

我的配置

@Configuration
@PropertySource(value = "classpath:tmdb.properties")
public class TMDbConfig {

    @Value("${moviedb.tmdb.api-key}")
    private String apiKey;

    public String getApiKey() {
        return apiKey;
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

调用配置

@Component
public class TMDbWarper {

@Autowired
private TMDbConfig tmdbConfig;

private TmdbApi tmdbApi;

public TMDbWarper(){
    tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}

当我自动连接warper时,我在构造函数中得到了一个NullPointerException。


答案 1

对于现场注射:

字段是在构建 Bean 之后,在调用任何配置方法之前立即注入的。此类配置字段不必是公共字段。有关完整用法,请参阅自动连接注释。在这种情况下使用构造函数注入,如下所示:

@Component
public class TMDbWarper {

    private TMDbConfig tmdbConfig;

    private TmdbApi tmdbApi;

    @Autowired
    public TMDbWarper(final TMDbConfig tmdbConfig){
            this.tmdbConfig = tmdbConfig;
            tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
    }

(或)

用于初始化,如下所示:@PostConstruct

@Component
public class TMDbWarper {

    @Autowired
    private TMDbConfig tmdbConfig;

    private TmdbApi tmdbApi;

    @PostConstruct
    public void init() {
        // any initialisation method
        tmdbConfig.getConfig();
    }

答案 2

自动布线在创建对象后立即执行(通过反射调用构造函数后)。因此,在构造函数中是预期的,因为在调用构造函数期间,字段将为 nullNullPointerExceptiontmdbConfig

您可以使用 @PostConstruct 回调方法解决此问题,如下所示:

@Component
public class TMDbWarper {

    @Autowired
    private TMDbConfig tmdbConfig;

    private TmdbApi tmdbApi;

    public TMDbWarper() {

    }

    @PostConstruct
    public void init() {
        tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
    }

    public TmdbApi getTmdbApi() {
        return this.tmdbApi;
    }
}

您的其余配置在我看来是正确的。

希望这有帮助。


推荐