Java 属性和环境始终为空

Java 属性和环境始终为空,java,spring,Java,Spring,我很难从属性文件加载属性。我正在尝试将属性加载到下面列出的配置类中 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; imp

我很难从属性文件加载属性。我正在尝试将属性加载到下面列出的配置类中

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”被注入变量snot中。但即使这样也做不到。我也无法自动连接环境。。。不确定是否有关系

my application.properties的内容如下所示

snot=snog
我的application.properties文件位于src/main/resources/中


有人知道我做错了什么吗?

构造函数的目的是初始化类实例。您必须先构造并初始化类实例,然后Spring才能对其执行任何操作。因此,您不能期望
env
snot
字段在构造函数中除了默认的
null
值之外还有任何内容。

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
}