3.13.3 PropertySource abstraction

Spring的Environment抽象提供用于一系列的property sources属性配置文件的搜索操作。 要充分说明,请考虑以下内容:

ApplicationContext ctx = new GenericApplicationContext();
Environment env = ctx.getEnvironment();
boolean containsFoo = env.containsProperty("foo");
System.out.println("Does my environment contain the 'foo' property? " + containsFoo);

在上面的代码段中,我们看到一个高级别的方法来询问Spring是否为当前环境定义了foo属性。 为了回答这个问题,Environment对象对一组 PropertySource对象进行搜索。 PropertySource是对任何键值对的简单抽象,Spring的StandardEnvironment 配置有两个PropertySource对象 - 一个表示JVM系统属性( a la System.getProperties()),一个表示系统环境变量 ( a la System.getenv())。

[Note]
这些默认property源在“StandardEnvironment”中存在,用于独立应用程序。 StandardServletEnvironment用默认的property配置源填充,默认配置源包括servlet配置和servlet上下文参数。 它可以选择启用JndiPropertySource。 有关详细信息,请参阅javadocs.

具体来说,当使用StandardEnvironment时,如果在运行时存在foo系统属性或foo环境变量,env.containsProperty(“foo”)的调用将返回true。

[Tip]
执行的搜索是分层的。 默认情况下,系统属性优先于环境变量,因此如果在调用env.getProperty(“foo”)时,两个地方都设置了foo属性,系统属性值 返回优先于环境变量。 注意,属性值不会被合并,而是被前面的条目完全覆盖。对于公共的“StandardServletEnvironment”,完整的层次结构如下,最高优先级条目在顶部:ServletConfig参数(如果适用,例如case ServletContext参数(web.xml上下文参数条目)JNDI环境变量(“java:comp / env /”条目)JVM系统属性(“-D”命令行参数)JVM系统环境 系统环境变量)

最重要的是,整个机制是可配置的。也许你需要一个自定义的properties源,并将该源整合到这个检索层级中。 没问题 - 只需简单实现和实例化你自己的PropertySource,并将其添加到当前“Environment”的“PropertySources”集中:

ConfigurableApplicationContext ctx = new GenericApplicationContext();
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.addFirst(new MyPropertySource());

在上面的代码中,“MyPropertySource”在搜索中以最高优先级添加。 如果它包含一个foo属性,,它将会被探测并返回,优先于其他PropertySource中的fooproperty属性。MutablePropertySourcesAPI暴露了很多方法,允许你精准的操作property属性源。

results matching ""

    No results matching ""