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

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);
         
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值