我很难从属性文件中加载属性。我试图将属性加载到下面列出的配置类中。
package dk.fitfit.budget.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
@Configuration
@PropertySource("classpath:application.properties")
public class ApplicationConfig {
private static final Logger logger = LoggerFactory.getLogger(ApplicationConfig.class);
@Autowired
private Environment env;
@Value("${snot:test}")
private String snot;
public ApplicationConfig() {
logger.info("Application config loaded!"); // Displays as expected
logger.info("snot: {}", snot); // snot: null
logger.info("env: {}", env); // env: null
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
如果我更改文件的名称(application.properties)或" @PropertySource(" classpath:application.properties")"我收到有关文件不存在的错误。很明显它被加载(无论如何)。
我至少期待看到默认字符串" test"注入变量鼻涕。但即便如此。我也无法自动装配环境......不确定是否存在关系。
我的application.properties的内容如下。
snot=snog
我的application.properties文件放在src / main / resources /.
中任何人都知道我做错了什么?
答案 0 :(得分:5)
构造函数的目的是初始化一个类实例。在Spring可以对它做任何事情之前,你必须构造并初始化类实例。因此,您不能指望env
和snot
字段在构造函数中包含除默认null
值之外的任何内容。
答案 1 :(得分:4)
Spring(以及所有依赖注入工具)在使用new
创建实例之前无法注入字段,这是构造函数注入应优先于字段注入的一个原因。通常,您可以对构造函数参数使用@Value
,但@Configuration
类存在某些问题会导致构造函数注入不切实际。
然而,有一个解决方案适用于这种情况:@PostConstruct
。在DI框架完成了对bean的所有魔术之后,将调用此方法:
@PostConstruct
public void log() {
logger.info("Application config loaded!"); // Displays as expected
logger.info("snot: {}", snot); // snot: null
logger.info("env: {}", env); // env: null
}