您的位置:首页 > 编程语言 > Java开发

spring 属性文件的载入,支持正则表达式

2008-11-25 18:08 363 查看
pe1.在Spring 中可以使用以下两个类加载资源文件:
org.springframework.context.support.ResourceBundleMessageSource

org.springframework.context.support.ReloadableResourceBundleMessageSource
后者可以不重起服务器的情况下,读取资源文件,所以可以随时更改资源文件。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>message</value>
</list>
</property>
</bean>
测试:
Object[] args = {"我", "你"};
String msg = applicationContext.getMessage("hello", args, Locale.CHINA);
System.out.println("msg=" + msg);
如果利用applicationContext.getMessage(xxx),则id只能为“messageSource”。因为这里的Class需要填入MessageSource接口的实现。
但可以直接用:
((AbstractMessageSource)applicationContext.getBean("messageSource")).getMessage(xxxx)
支持通配符的加载属性文件:
import java.util.Locale;
public abstract class AbstractMessageResources {
public String getMessage(String key) {
return getMessage(key, Locale.getDefault());
}
public String getMessage(String key, Object param) {
return getMessage(key, new Object[] {param}, null, Locale.getDefault());
}
public String getMessage(String key, Object[] params) {
return getMessage(key, params, Locale.getDefault());
}
public String getMessage(String key, Object[] params, Locale locale) {
return getMessage(key, params, null, locale);
}
public String getMessage(String key, Locale locale) {
return getMessage(key, null, null, locale);
}
public String getMessage(String key, Object param, Locale locale) {
return getMessage(key, new Object[] {param}, null, locale);
}

public abstract String getMessage(String key, Object[] params, String defaultMessage, Locale locale);
}
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
public class RegexPropertyMessageResources extends AbstractMessageResources {

static Log logger = LogFactory.getLog(RegexPropertyMessageResources.class);

public static String PROPERTY_POSTFIX = ".properties";
//加载属性资源文件
// private ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
private ReloadableResourceBundleMessageSource resourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
//支持通配符匹配 
private PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
public RegexPropertyMessageResources() {

}
public RegexPropertyMessageResources(String baseName) {
setBaseNames(new String[] { baseName });
}
public RegexPropertyMessageResources(String[] baseNames) {
setBaseNames(baseNames);
}
public void setBaseName(String baseName) {
setBaseNames(new String[] { baseName });
}

public void setBaseNames(String[] baseNames) {
List<String> baseNameList = new ArrayList<String>();
try {
for(String baseName : baseNames) {
Resource[] resources = patternResolver.getResources(baseName); //通过通配符取得到所有对应的source
for(Resource resource : resources) {
String fileName = resource.getFilename();
baseNameList.add(fileName.substring(0, fileName.indexOf(PROPERTY_POSTFIX)));
//除掉后的.properties后缀,因为直接用ResourceBundleMessageSource,是不用加后缀的
if(logger.isInfoEnabled()) {
logger.info("Add properties file: [" + resource.getDescription() + "]");
}
}
}
} catch(Exception e) {
throw new RuntimeException(e);
}
this.resourceBundleMessageSource.setBasenames(baseNameList.toArray(new String[baseNameList.size()]));
}
//取得属性对应的信息
public String getMessage(String key, Object[] params, String defaultMessage, Locale locale) {
return this.resourceBundleMessageSource.getMessage(key, params, defaultMessage, locale);
}
}
<bean id="regexPropertyMessageResources" class="test.RegexPropertyMessageResources">
<property name="baseNames">
<list>
<value>message*.properties</value>
</list>
</property>
</bean>
@Test
public void loadProp3(){
Object[] args = {"我", "你"};
String msg = ((AbstractMessageResources)super.getBean("regexPropertyMessageResources")).getMessage("hello", args, Locale.CHINA);
assertEquals("我and你",msg);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐