Spring ApplicationContextInitializer和属性

时间:2016-01-27 21:16:26

标签: spring

我正在学习ApplicationContextInitializer。 我正在阅读如下所示的示例,该示例是webapp设置的一部分

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext>{
.....
.....
public void initialize(ConfigurableWebApplicationContext applicationContext)  {
String homeKey = ((ConfigurableWebApplicationContext)applicationContext).getServletContext().getInitParameter("homekey");
.................
...............

相应的web.xml

...............
...............
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.xxx.config</param-value>
    </context-param>
    <context-param>
        <param-name>contextInitializerClasses</param-name>
        <param-value>com.xxxx.MyApplicationContextInitializer</param-value>
    </context-param>
    <context-param>
        <param-name>homekey</param-name>
        <param-value>yyyyy</param-value>
    </context-param>
.............
...............

我想在NON webapp应用程序中复制此行为,更多用于学习目的。

我修改了MyApplicationContextInitializer,如下所示

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{
................
......................
public void initialize(ConfigurableApplicationContext applicationContext) {
............
.............

我的问题是如何在没有web.xml的情况下获得“homekey”。我假设我可以使用系统属性或使用属性文件并调用方法applicationContext.getEnvironment()。getProperty或applicationContext.getResource()。如果没有系统属性或属性文件,我可以这样做吗? web.xml没有使用任何属性文件。

1 个答案:

答案 0 :(得分:1)

如果您当前正在使用Spring Boot 2,并且想使用漂亮的强类型配置对象...

@Data     // lombok for terseness (getters / setters)
@Configuration
@ConfigurationProperties(prefix = "my-config")
public class MyConfigProps {

    private String homekey;
    ... 

}

...针对您的application.yaml文件中的属性...

my-config: 
    homekey: yyyyy
    ...

...并以编程方式在ApplicationContextInitializer(在春季生命周期的早期出现)中检索属性类,则可以使用Binder对象(请参见https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide),即/ p>

public class Initializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> {

    @Override
    public void initialize(ConfigurableWebApplicationContext applicationContext) {
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        MyConfigProps configProps = Binder.get(environment).bind("my-config", MyConfigProps);
        System.out.println(configProps.getHomekey());
    }

}