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

Posted

技术标签:

【中文标题】Spring 将属性文件中的值读入 @SpringBootApplication 类【英文标题】:Spring Read value from properties file into @SpringBootApplication class 【发布时间】:2016-04-19 22:02:28 【问题描述】:

我有一个 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;
     

不幸的是,在名为“设置”的方法中,属性 modemSmsDelay 的值也为 0,如果在我的 application.properties 文件中为 1000。

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

==== 更新 =====

我解决了这个问题。事实上,我的代码可以工作,不需要@PostConstruct 来使@Value 标签工作,如果它在几种情况下都是可取的。 我的 Spring 配置中有一个问题,它阻止了所有注释作为 @PostConstruct、@Autowire 等的执行。 我从 Spring 打印警告消息的日志中注意到了这一点。

【问题讨论】:

您不需要添加 ComponentScan 或 PropertySource 注释,因为 SpringBootApplication 注释已经包含它们。 检查application.properties的路径是否正确,你传递的属性名称是否正确server.modem.delay 他从构造函数中调用它。 我明白了。下面的答案是正确的,他需要添加 PostConstruct 注解。 @11thdimention application.properties 的路径也可以,属性名也可以。 【参考方案1】:

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

【讨论】:

另外,如果我用@PostConstruct 注释来注释 settings() 方法,则不会调用该方法。 只是为了说明,我没有从构造函数调用 settings()。【参考方案2】:

这对我有用:

@Resource 私有环境环境;

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

【讨论】:

以上是关于Spring 将属性文件中的值读入 @SpringBootApplication 类的主要内容,如果未能解决你的问题,请参考以下文章

将动态属性列表读入 Spring 托管 bean

将文件中的值读入 applicationContext.xml 文件

是否可以使用 Spring 和 @Value 注释将 YAML 属性读入 Map

@Controller 类中的 Spring @Value 注释未评估属性文件中的值

如何在 Spring Boot 中将属性文件值读入字符串集

如何使用 Spring Boot 应用程序中另一个属性文件中的值解析属性文件中的占位符