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);
}
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);
}
相关文章推荐
- spring 属性文件的载入,支持正则表达式
- spring_scope作用域和使用外部属性文件和spEL表达式
- 发布一个自己写的文件重命名工具,支持正则表达式替换和自定义规则。
- 1. 为需要的页面,添加 JS 文件.思想是在页面提交的时候判断控件的正则表达式属性,
- spring 加载xml文件,支持正则表达式
- Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径
- JavaScript 正则表达式(RegExp对象、属性、方法、String支持)
- 验证文件路径的正则表达式(支持网络路径)
- Linux运维学习笔记之六:Linux中的文件类型、属性、正则表达式、权限体系
- Spring配置文件context:property-placeholder无法载入属性问题
- 51. spring boot属性文件之多环境配置【从零开始学Spring Boot】
- Spring根据XML配置文件注入对象类型属性
- 此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数据库属性”对话框的“文件”页或 ALTER AUTHORIZATION 语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象。
- 关于spring配置文件中 ref 属性的设定
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace
- 2、spring-boot 工程配置——配置文件详解:自定义属性、随机数、多环境配置等
- C#中利用正则表达式检测文件路径的合法性
- 扩展Spring--外部属性文件安全(三)
- .net验证控件的属性与使用技巧---总结及正则表达式语法
- 匹配获取HTML标签属性的正则 表达式