Spring应用程序ContextInitializer和属性

Spring应用程序ContextInitializer和属性,spring,Spring,我正在学习ApplicationContextInitializer。 我正在阅读一个示例,如下所示,它是webapp设置的一部分 public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext>{ ..... ..... public void initialize(ConfigurableWebApplic

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

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext>{
.....
.....
public void initialize(ConfigurableWebApplicationContext applicationContext)  {
String homeKey = ((ConfigurableWebApplicationContext)applicationContext).getServletContext().getInitParameter("homekey");
.................
...............
公共类MyApplicationContextInitializer实现ApplicationContextInitializer{
.....
.....
公共void初始化(可配置的WebApplicationContext应用上下文){
字符串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>
.............
...............
。。。。。。。。。。。。。。。
...............
上下文类
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
上下文配置位置
com.xxx.config
上下文初始化类
com.xxxx.MyApplicationContextInitializer
homekey
YYYY
.............
...............
我想在非webapp应用程序中复制此行为,更多用于学习目的

我对MyApplicationContextInitializer进行了如下修改

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{
................
......................
public void initialize(ConfigurableApplicationContext applicationContext) {
............
.............
公共类MyApplicationContextInitializer实现ApplicationContextInitializer{
................
......................
public void初始化(ConfigurableApplicationContext applicationContext){
............
.............

我的问题是如何在没有web.xml的情况下获取“homekey”。我假设我可以使用系统属性或使用属性文件并调用方法applicationContext.getEnvironment().getProperty或applicationContext.getResource()。我可以在没有系统属性或属性文件的情况下执行此操作。web.xml没有使用任何属性文件。

如果您当前正在使用Spring Boot 2,并且希望使用nice强类型配置对象

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

    private String homekey;
    ... 

}
…针对
应用程序.yaml
文件中的属性

my-config: 
    homekey: yyyyy
    ...
…并以编程方式检索
ApplicationContextInitializer
(在spring生命周期的早期出现)中的属性类,然后您可以使用
Binder
对象(请参见)

公共类初始值设定项实现ApplicationContextInitializer{
@凌驾
公共void初始化(可配置的WebApplicationContext应用上下文){
ConfigurableEnvironment=applicationContext.getEnvironment();
MyConfigProps configProps=Binder.get(environment.bind(“我的配置”,MyConfigProps);
System.out.println(configProps.getHomekey());
}
}

如果您当前正在使用Spring Boot 2,并且希望使用nice强类型配置对象

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

    private String homekey;
    ... 

}
…针对
应用程序.yaml
文件中的属性

my-config: 
    homekey: yyyyy
    ...
…并以编程方式检索
ApplicationContextInitializer
(在spring生命周期的早期出现)中的属性类,然后您可以使用
Binder
对象(请参见)

公共类初始值设定项实现ApplicationContextInitializer{
@凌驾
公共void初始化(可配置的WebApplicationContext应用上下文){
ConfigurableEnvironment=applicationContext.getEnvironment();
MyConfigProps configProps=Binder.get(environment.bind(“我的配置”,MyConfigProps);
System.out.println(configProps.getHomekey());
}
}

web.xml本身就是属性('homekey)所在的位置取自。这与使用属性文件的概念完全相同。两者都表示某种“外部化”配置。您使用“环境”抽象的想法是正确的。第一种方法在imho中已经是错误的。请改用
Environment
applicationContext.getEnvironment().getProperty(“homekey”)
。根据启动应用程序的方式,系统属性/环境、jndi和/或web上下文将被查询。这样,您可以在两种情况下使用相同的初始值设定项。谢谢大家的回复web.xml本身就是属性('homekey)的所在地取自。这与使用属性文件的概念完全相同。两者都表示某种“外部化”配置。您使用“环境”抽象的想法是正确的。第一种方法在imho中已经是错误的。请改用
Environment
applicationContext.getEnvironment().getProperty(“homekey”)
。根据启动应用程序的方式,系统属性/环境、jndi和/或web上下文将被查询。这样,您可以在两种情况下使用相同的初始值设定项。谢谢大家的回复