一般来说Spring配置文件<context:property-placeholder>
标签提供了优雅的外在化属性配置方式,通过属性文件可以是程序需要的某些参数可以配置,而无需改动程序
但是当多个属性文件一起加载时,<context:property-placeholder>
标签有一个复杂的加载顺序综合作用,如果又无法很有效的控制属性文件中属性名的规范,极易出现重名的属性,导致得不到理想的属性值
而且<context:property-placeholder>
标签采用依赖注入的方式,需要Bean中存在该属性对应的类属性,并提供setter方法,从而在bean文件中进行注入
public class SpringBean {
private String userId;
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
<bean id="springBean" class="com.dragon.spring.SpringBean">
<property name="userId"><value>${userId}</value></property>
<property name="userName"><value>${userName}</value></property>
</bean>
但是有时我们在某个Handle或者Service服务类中,某个方法中需要该属性的值,类似的类有很多,每个类都将需要定义类属性、getter、settter方法,并进行注入,此时不妨尝试通过单例模式来提供一个提供属性值的单例类,该类在实例化时将加载指定的属性文件,可以加载多个属性文件,也可以加载指定属性文件
public class DefaultInfo {
private static DefaultInfo defaultInfo = null;
private Properties defaultProperties = new Properties();
private DefaultInfo() throws IOException{
this("DefaultInfo.properties");
}
private DefaultInfo(String path) throws IOException{
defaultProperties.load(this.getClass().getClassLoader().getResourceAsStream(path));
}
public static synchronized DefaultInfo getInstance() throws IOException{
if (defaultInfo == null) {
defaultInfo = new DefaultInfo("DefaultInfo.properties");
}
return defaultInfo;
}
public String getProperty(String key){
return defaultProperties.getProperty(key);
}
}
在需要的地方调用该类的静态公共方法即可
String userId = DefaultInfo.getInstance().getProperty("userId");
上述方式是本人的一种个人尝试!但是像一些非程序中需要的参数,比较数据库连接属性,数据库连接属性一般是持久层框架所需,并不需要读入到程序中,那么还是首选推荐Spring的<context:property-placeholder>
标签