Spring加载资源文件并静态化

Easter79
• 阅读 637

说明:

      在实际项目中有时候需要用到很多的配置文件,而这些配置文件我们又想按功能分文件加载。

第一步

      我们需要在Spring的配置文件中加入一段配置,配置如下

<bean id="propertyBean" class="com.funo.util.WcityProperty">
  <property name="locations">
   <list>
    <value>/WEB-INF/config/wcity-*.properties</value>
    </list>
  </property>
 </bean>

      以上配置中我们需要建立一个类com.funo.util.WcityProperty 这个类继承了Spring读取资源文件的PropertyPlaceholderConfigurer类,该类可以帮你自动加载配置文件到全局资源文件中。当然/WEB-INF/config/wcity-*.properties部分你也可以读取外部的文件如:file:c:/wcity-*.properties 还可以配置他的编码,不过我建议使用全局编码。

第二步

      我们需要开始写com.funo.util.WcityProperty这个类

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

/**
 * 采用Spring的加载属性信息 在应用中获取
 * 
 * @author zhys513
 * 
 */
public class WcityProperty extends PropertyPlaceholderConfigurer {

    private Map<String, String> resolvedProps;// 将属性保存起来

    @SuppressWarnings("unchecked")
    @Override
    protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
            throws BeansException {
        super.processProperties(beanFactoryToProcess, props);
        resolvedProps = new HashMap<String, String>();
        for (Object key : props.keySet()) {
            String keyStr = key.toString();
            resolvedProps.put(keyStr, parseStringValue(props.getProperty(keyStr), props, new HashSet()));
        }
    }

    public Map<String, String> getResolvedProps() {
        return resolvedProps;
    }

    public void setResolvedProps(Map<String, String> resolvedProps) {
        this.resolvedProps = resolvedProps;
    }
}

 这个类其实只是做了一个转换,到这里,直接从Spring的上下文已经可以取到这个propertyBean,但是为了更方便使用我们需要把Spring加载进来的资源文件读取到一个静态的常量工具类中,代码如下:

import java.util.HashMap;
import java.util.Map;

/**
 * 表常量类
 * zhys513
 */
public class WcityConstant {

    @SuppressWarnings("unchecked")
    private static HashMap properties;

    @SuppressWarnings("unchecked")
    public static void setProperties(Map<String, String> maps) {
        WcityConstant.properties = (HashMap) maps;
    }

    /**
     * 通过key,查找property中key的内容
     * 
     * @param key
     *            property的key
     * @return 返回对应的value
     */
    public static String getProValue(String key) {
        String returnValue = (String)properties.get(key);
        if(returnValue == null || "".equals(returnValue)) 
            returnValue = "";
        return returnValue.trim();
    } 
}

到这里这个常量类还不能使用。我们还需要把这个常量累和资源文件建立一个关系。想到的方法是启动的时候直接加载,如果有需要每几分钟就加载一次的童鞋可以另外配置。这里就不多说了。以下为监听器代码:

import java.util.Map;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class WcityServletContextListener implements ServletContextListener {
    @SuppressWarnings("unused")
    private static final Log log = LogFactory.getLog(WcityServletContextListener.class);

    public void contextInitialized(ServletContextEvent event) {
        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
        WcityProperty propertyBean = (WcityProperty) wac.getBean("propertyBean");
        Map<String, String> maps = propertyBean.getResolvedProps();
        WcityConstant.setProperties(maps);
    }

    public void contextDestroyed(ServletContextEvent event) {

    }

}

 既然我们使用到了监听器,那就需要配置下监听器,WEB.xml监听器的配置如下:

<listener>
        <listener-class>com.funo.util.WcityServletContextListener</listener-class></listener>

资源文件里面我就不多说了。大家都懂。如果资源文件里面需要放中文字,请设置编码。资源文件:

# 平台验证登录开关 0 0FF  1ON
PORTAL_CHECK_LOGIN_STATUS=0

具体使用如下:

WcityConstant.getProValue("PORTAL_CHECK_LOGIN_STATUS")

直到这里,可以由Spring模糊加载资源文件并在类中直接使用。

 来源:优特产     个人博客:优特品

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k