其它的Spring技巧(外部化配置,JNDI,Email,调度任务,异步方法)

外部化配置

大多数情况下,我们会将整个应用程序配置在一个配置文件中,但是,你会发现,修改变得麻烦,也容易暴露敏感信息.这时候,可以将一部分配置抽取到配置文件中管理会很方便.

Spring自带了几个选项,可以借助它们将Spring配置细节信息外部化到属性文件中,这样就能在部署的应用之外进行管理:

  1. 属性占位符配置(Property placeholder configurer)会将占位符内的变量替换为外部属性文件的值.
  2. 属性重写(Property overrider)会将Bean属性的值用外部属性文件的值进行重写.

替换属性占位符

例如:

1
<context:property-placeholder location="classpath:/db.properties" />

对于db.properties文件,它将至少包含DriverManagerDataSource所需要的属性:

1
2
3
4
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost/spitter/spitter
jdbc.username=spitterAdmin
jdbc.password=toshheps

现在,你可以将Spring配置中的硬编码替换为基于db.properties属性的占位符的变量:

1
2
3
4
5
<bean id="dataSource" calss="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />

属性占位符配置的作用不限于XMl中的Bean属性配置,你还可以用它来配置@Value注解的属性,例如,如果有个Bean需要JDBC url,可以这样使用:

1
2
@Value("${jdbc.url}")
String dataBaseUrl ;

你甚至可以在属性文件自身中使用占位符变量:

1
2
3
4
jdbc.protocol = hsqldb:hsql
db.server= localhost
db.name= spitter
jdbc.url=jdbc:${jdbc.protocol}://${db.server}/${db.name= spitter}/${db.name= spitter}

替换缺失的属性

如果一个属性占位符变量引用了没有定义的属性,或者location指向的文件不存在,可以这么配置,使其在失败时不抛出异常,需要配置property-placeholderignore-resource-not-foundignore-unresolvable属性:

1
2
3
4
<context:property-placeholder location="classpath:/db.properties"
ignore-resource-not-found="true"
ignore-unresolvable="true"
properties-ref="defaultConfiguration" />

但是不抛出异常,占位符会是未解析的状态,这个时候也是无法正常使用的,所以有properties-ref用来配置默认的装配属性值:

1
2
3
4
5
6
<util:properties id="defaultConfiguration">
<prop key="jdbc.url">jdbc:hsqldb:hsql://localhost/spitter/spitter</prop>
<prop key="jdbc.driverClassName">org.hsqldb.jdbcDriver</prop>
<prop key="jdbc.username">spitterAdmin</prop>
<prop key="jdbc.password">toshheps</prop>
</util:properties>

现在,如果有占位符变量无法在db.properties中找到,那么将使用defaultConfigurationBean中的默认值 .

通过系统属性解析占位符变量
1
2
3
4
5
<context:property-placeholder location="classpath:/db.properties"
ignore-resource-not-found="true"
ignore-unresolvable="true"
properties-ref="defaultConfiguration"
system-properties-mode="OVERRIDE" />

这里system-properties-mode被设置为OVERRIDE,这意味着<context:property-placeholder >会优先使用系统属性.
除了OVERRIDE,system-properties-mode还有2个属性值:

  1. FALLBACK:如果不能从属性文件中解析占位符变量,将使用系统属性.
  2. NEVER:从不使用系统属性来解析占位符变量.
  3. OVERRIDE:相对于配置文件,优先使用系统属性.

属性重写

热评文章