属性和env始终为null

时间:2014-10-19 22:05:36

标签: 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;
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 /.

任何人都知道我做错了什么?

2 个答案:

答案 0 :(得分:5)

构造函数的目的是初始化一个类实例。在Spring可以对它做任何事情之前,你必须构造并初始化类实例。因此,您不能指望envsnot字段在构造函数中包含除默认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
}