Spring将属性文件中的值读取到@SpringBootApplication类中

时间:2016-01-14 14:24:13

标签: java spring spring-boot properties-file

我是一个SpringBootApplication,我想从我的属性文件中读取一个值。

我的@SpringBootApplication类是:

@SpringBootApplication
@ComponentScan(basePackages = "it.test")
@PropertySource("classpath:application.properties")
public class Application {
      private static Logger log = LogManager.getLogger();

      @Value("${server.modem.delay}")
      private int modemSmsDelay;

     @Order(Ordered.HIGHEST_PRECEDENCE)
     @Bean(initMethod = "start", destroyMethod = "stop")
     public Service smsService() {      
         settings();
         Service service = Service.getInstance();       
         return service;
     }
      private void settings() {     
           log.debug("Delay per invio sms " + modemSmsDelay +"ms");     
            Settings.gatewayDispatcherYield = modemSmsDelay;
     }
}

不幸的是在名为" settings"如果在我的application.properties文件中,属性modemSmsDelay的值也为0。

在我的应用程序的其他部分,我可以毫无问题地阅读值。

====更新=====

我解决了这个问题。事实上我的代码是有效的,不需要@PostConstruct来使@Value标签工作,如果它在几个环境中是令人盼望的。 我在Spring配置中遇到了一个问题,它阻止了所有注释的执行,如@ PostConstruct,@ Autowire等。 我在日志中注意到了这一点,其中Spring打印了一条警告信息。

2 个答案:

答案 0 :(得分:1)

尝试将@PostConstruct注释放在settings()方法上,而不是从构造函数中调用它。这将导致在构造函数退出后自动调用该方法。

答案 1 :(得分:0)

这对我有用:

@Resource private Environment environment;

import javax.annotation.Resource;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

import my.beautiful.code.SomeClient;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

  @Resource
  private Environment environment;

  @Override
  protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }

  @Bean(name = "someClient")
  public SomeClient loadSomeClient() {
      SomeClient bean = new SomeClient();
      ...
      bean.setHeaderContentType(environment.getProperty("contentType"));
      bean.setRestUrl(environment.getProperty("rest.url"));   
      ...
      return bean;
  }

  public static void main(final String[] args) {
    SpringApplication.run(Application.class, args);
  }

}

在我的application.properties

contentType=some_value
rest.url=http://localhost/....

HTH