2014-10-19 88 views
4

我很难从属性文件中加载属性。我试图加载一个属性到我下面列出的配置类中。属性和env始终为空

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的名称(”类路径:application.properties“)”我得到一个错误约不存在的文件。很显然,它正在被加载(无论如何)。

我至少期待看到默认字符串“测试”注入变量鼻涕。但即使这样做也完成了。我无法自动装入环境......不知道是否有关系。

我的application.properties的内容如下。

snot=snog 

我的application.properties文件放在src/main/resources /中。

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

回答

5

构造函数的目的是初始化一个类实例。在Spring可以做任何事情之前,你必须构造和初始化类实例。因此,您不能期望envsnot字段在构造函数中具有除缺省值null以外的任何值。

+1

恭喜你,我得到了最后一票......不能再投一小时。 – 2014-10-19 23:17:15

4

在创建实例之前,Spring(以及所有依赖注入工具)无法注入字段,这是为什么构造函数注入应该优先于字段注入的一个原因。通常,您可以在构造函数参数上使用@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 
} 
+0

这正是我所寻找的。谢谢! – 2017-11-07 07:59:44