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 类的主要内容,如果未能解决你的问题,请参考以下文章
将文件中的值读入 applicationContext.xml 文件
是否可以使用 Spring 和 @Value 注释将 YAML 属性读入 Map