添加指定的properties配置文件
@PropertySource
@PropertySource
可以将指定的properties文件添加到Environment
中:
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}
在路径中还可以使用${}
:
@PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties"
以上假设my.placeholder
已被注册, 它将会解析为相应的值, 如果没有则会使用default/path
作为默认值, 如果二者都没有定义, 则会抛出IllegalArgumentExcetion
异常.
在java8中,
@PropertySource
是可重复, 但是都必须在同一个级别声明.
XML方式
context:property-placeholder
<context:property-placeholder location="xxx.properties"/>
- util:properties
<util:properties id="util_spring" location="xxx.properties"/>
// 使用
<property name="username" value="#{util_spring['jdbc.username']}" />
- PropertyPlaceholderConfigurer
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:redis-key.properties</value>
</list>
</property>
</bean>
Enviroment
在spring中, Environment
是对应用环境的抽象(即对Profile
和properties
的抽象).
- Environment提供了对配置属性进行搜索的操作.
ApplicationContext ctx = new GenericApplicationContext();
Environment env = ctx.getEnvironment();
// PropertySource是对属性键值对的简单抽象, 下面的方法会在一个PropertySource集合中进行搜索
boolean containsFoo = env.containsProperty("foo");
StandardEnviroment
StandardEnviroment
配置了两个PropertySource
对象, 一是JVM系统属性(类似于System.getProperties()
), 二是系统环境变量(类似于System.getenv()
).
-
StandardEnvironment
应用于独立应用程序,StandardServletEnvironment
包含了servlet
和servlet context
参数.它还可选择性的开启JndiPropertySource
. -
默认情况下, 系统属性会覆盖环境变量.即
env.getProperty("foo")
会返回系统属性. -
对于
StandardServletEnvironment
, 其优先级从高到低如下:-
ServletConfig
参数, 如DispatcherServlet
上下文参数. -
ServletContext
参数.如web.xml
中的context-param
. - JNDI环境变量,如
java:comp/env/
- JVM系统属性, 如 -D命令行参数
- 系统环境变量,如操作系统环境变量
-
自定义PropertySource
扩展PropertySource
.注册到容器中:
MutablePropertySources sources = env.getPropertySources();
sources.addFirst(new MyPropertySource());
addFirst
方法其优先级最高.
网友评论