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()
)。
这些默认property源在“StandardEnvironment”中存在,用于独立应用程序。 StandardServletEnvironment 用默认的property配置源填充,默认配置源包括servlet配置和servlet上下文参数。 它可以选择启用JndiPropertySource 。 有关详细信息,请参阅javadocs. |
具体来说,当使用StandardEnvironment
时,如果在运行时存在foo
系统属性或foo
环境变量,env.containsProperty(“foo”)
的调用将返回true。
执行的搜索是分层的。 默认情况下,系统属性优先于环境变量,因此如果在调用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
中的foo
property属性。MutablePropertySources
API暴露了很多方法,允许你精准的操作property属性源。