Spring学习笔记(六)-----Spring in Action
分散配置:
有时你会发现将配置文件分成几个分散的配置文件是很有益的。
将Data Source配置到Bean装配文件中不是很适合。数据库细节是一个发布信息。而Bean装配文件的目的是定义如何装配系统的各个模块。如果使用ApplicationContext当作Spring容器,那么,在Spring中分离属性配置是很简单的。使用Spring的PropertyPlaceholderConfigurer告诉Spring从外部属性文件装载一些配置信息。
<
bean
id
="dataSource"
class
="org.springframework.jdbc.datasource.DriverManagerDataSource"
>
< property name ="url" >
< value > jdbc:hsqldb:Training </ value >
</ property >
< property name ="driverClassName" >
< value > org.hsqldb.jdbcDriver </ value >
</ property >
< property name ="username" >
< value > appUser </ value >
</ property >
< property name ="password" >
< value > password </ value >
</ property >
</ bean >
location属性告诉Spring从哪里找到属性文件。location属性允许你使用单个配置文件。如果你想将配置信息分散到多个配置文件中,请使 用PropertyPlaceholderConfigurer的locations属性设置文件列表,使用这种方式,可以使用占位符变量代替Bean装 配文件中的硬编码配置了。
< property name ="url" >
< value > jdbc:hsqldb:Training </ value >
</ property >
< property name ="driverClassName" >
< value > org.hsqldb.jdbcDriver </ value >
</ property >
< property name ="username" >
< value > appUser </ value >
</ property >
< property name ="password" >
< value > password </ value >
</ property >
</ bean >
<
bean
id
="propertyConfigurer"
class
="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"
>
< property name ="location" >
< value > jdbc.properties </ value >
</ property >
< property name ="locations" >
< list >
< value > jdbc.properties </ value >
< value > security.properties </ value >
< value > application.properties </ value >
</ list >
</ property >
</ bean >
< bean id ="dataSources" class ="org.springframework.jdbc.datasource.DriverManagerDataSource" >
< property name ="url" >
< value > ${database.url} </ value >
</ property >
< property name ="driverClassName" >
< value > ${database.driver} </ value >
</ property >
< property name ="username" >
< value > ${database.user} </ value >
</ property >
< property name ="password" >
< value > ${database.password} </ value >
</ property >
</ bean >
< property name ="location" >
< value > jdbc.properties </ value >
</ property >
< property name ="locations" >
< list >
< value > jdbc.properties </ value >
< value > security.properties </ value >
< value > application.properties </ value >
</ list >
</ property >
</ bean >
< bean id ="dataSources" class ="org.springframework.jdbc.datasource.DriverManagerDataSource" >
< property name ="url" >
< value > ${database.url} </ value >
</ property >
< property name ="driverClassName" >
< value > ${database.driver} </ value >
</ property >
< property name ="username" >
< value > ${database.user} </ value >
</ property >
< property name ="password" >
< value > ${database.password} </ value >
</ property >
</ bean >
定制属性编辑器:
java.beans.PropertyEditor接口提供了将字符串值映射成非String类型的方法。有一个好用的这个接口的实现-
java.beans.PropertyEditorSupport,它有2个方法我们会感兴趣:
1、getAsText():方法返回一个表示属性值的字符串。
2、setAsText(String value):将传递进来的字符串赋给Bean的属性。
Spring带了几种建立在propertyEditorSupport之上的定制编辑器,包括
org.springframework.beans.propertyeditors.URLEditor,它是一个用于将字符串与java.net.URL相互转换的定制编辑器。
Spring提供的其他定制编辑器包括:
1、ClassEditor-使用包含全称类名的字符串设置java.lang.Class属性。
2、CustormDateEditor-使用某种java.text.DateFormat对象将一个字符串设置给java.util.Date属性。
3、FileEditor-使用包含文件路径的字符串设置java.io.File属性。
4、LocalEditor-使用包含地域信息的字符串设置java.util.Local属性。
5、StringArrayPropertyEditor-将一个包含逗号的String转换成String数组属性。
6、StringTrimmerEditor-自动修正字符串属性,可以选择将空字符串转变为null.
<
bean
id
="costomEditorConfigurer"
class
="org.springframework.beans.factory.config.CustomEditorConfigurer"
>
< property name ="customEditors" >
< map >
< entry key ="com.wyq.spring.PhoneNumber" >
< bean id ="phoneEditor" class ="com.wyq.spring.PhoneEditor" ></ bean >
</ entry >
</ map >
</ property >
</ bean >
其中的map中的key表示要添加自定义属性的类,value表示自定义属性实现的类。
< property name ="customEditors" >
< map >
< entry key ="com.wyq.spring.PhoneNumber" >
< bean id ="phoneEditor" class ="com.wyq.spring.PhoneEditor" ></ bean >
</ entry >
</ map >
</ property >
</ bean >
package
com.wyq.spring;
import java.beans.PropertyEditorSupport;
public class PhoneEditor extends PropertyEditorSupport {
public void setAsText(String textValue) throws IllegalArgumentException {
String stripped = stripNonNumberic(textValue);
String areaCode = stripped.substring( 0 , 3 );
String prefix = stripped.substring( 3 , 6 );
String number = stripped.substring( 6 );
PhoneNumber phone = new PhoneNumber(areaCode,prefix,number);
setValue(phone);
}
private String stripNonNumberic(String original){
StringBuffer allNumberic = new StringBuffer();
for ( int i = 0 ;i < original.length();i ++ ){
char c = original.charAt(i);
if (Character.isDigit(c)){
allNumberic.append(c);
}
}
return allNumberic.toString();
}
}
import java.beans.PropertyEditorSupport;
public class PhoneEditor extends PropertyEditorSupport {
public void setAsText(String textValue) throws IllegalArgumentException {
String stripped = stripNonNumberic(textValue);
String areaCode = stripped.substring( 0 , 3 );
String prefix = stripped.substring( 3 , 6 );
String number = stripped.substring( 6 );
PhoneNumber phone = new PhoneNumber(areaCode,prefix,number);
setValue(phone);
}
private String stripNonNumberic(String original){
StringBuffer allNumberic = new StringBuffer();
for ( int i = 0 ;i < original.length();i ++ ){
char c = original.charAt(i);
if (Character.isDigit(c)){
allNumberic.append(c);
}
}
return allNumberic.toString();
}
}