Web 开发中公共属性已配置方式设计

本文探讨了三种不同的配置文件管理方法:使用Properties工具类、实现ServletContextListener监听器和利用Spring的PropertyPlaceholderConfigurer。每种方法都有其优缺点,适用于不同的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么情况下使用配置文件的方式设计

在web开发中,经常遇见一些用作项目配置的属性,比如说采用何种主题加载对应模块下的页面,使用项目的何种模式(debug,publish 等),还有设置项目的一些修改配置之类的东西,等等。这些东西都可以做成配置文件的方式,开发的时候只要修改配置文件就可以了

那么在涉及到这样的问题的时候,我们怎么设计比较好呢?

方式一

使用Properties做一个工具类,读取属性文件,做成单例

实例:

package fun.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PropertyHelper {
 private static Logger logger = LoggerFactory.getLogger(PropertyHelper.class);
 private static Properties property=null;

 private static Properties initProperty(){
  InputStream in = PropertyHelper.class.getClassLoader()  
                .getResourceAsStream("config/sysconf.properties");  
  property = new Properties();
  try {
   property.load(in);
  } catch (IOException e) {
   logger.error(e.toString());
   e.printStackTrace();
  }
  return property;
 }
 synchronized public static String getProperty(String key){
  if(property == null){
   property = initProperty();
  }
  return property.getProperty(key);
 }


}

属性的配置文件 config/sysconf.properties

这种方法实现,方便,简单,但是会出现一个问题,属性文件写在代码里面,修改属性文件的位子就必须要修改源代码,比如将 属性文件位子修改为 cfg/cfg.propertes

方式二

对Properties的改造,自顶义一个类实现ServletContextListener,做成一个listener,这样只在web应用启动的时候加载。而这个类中存储一个Properties的类做为成员变量(如果属性文件有多个的时候可以用一个List或者Map

package fun.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 *
 * <code>{@link AppConfigPropertyHelper}</code>
 *
 * TODO : 应用配置属性获取的类,实现listener接口,web应用启动的时候初始话,
 * 取出里面属性文件的值,在应用中使用
 *
 * @author fun
 */
public class AppConfigPropertyHelper implements ServletContextListener {

 Logger logger = LoggerFactory.getLogger(AppConfigPropertyHelper.class);
 private static Map<String,Properties> props = new HashMap<String,Properties>();
 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
  // TODO implement ServletContextListener.contextDestroyed
  props.clear();
 }
 @Override
 public void contextInitialized(ServletContextEvent arg0) {
  //arg0作为配置文件路径名,多个文件用','隔开
  ServletContext context = arg0.getServletContext();
  String propPaths = context.getInitParameter("appConfigPropPath").toString();//获取用户定义的web应用的路径
  System.out.println("=============================="+propPaths+"=============================");

        //通过类加载目录getClassLoader()加载属性文件  
        InputStream in = AppConfigPropertyHelper.class.getClassLoader()  
                .getResourceAsStream(propPaths.substring(propPaths.lastIndexOf(":")+1));  
        Properties prop = new Properties();  
        try {  
            prop.load(in);  
        } catch (IOException e) {  
            logger.error("读取配置文件出错");  
            e.printStackTrace();  
        }
        String propName = propPaths.contains("/") ? propPaths.substring(propPaths.lastIndexOf("/")+1,propPaths.lastIndexOf(".")):
         propPaths.substring(propPaths.lastIndexOf(":")+1,propPaths.lastIndexOf("."));
        System.out.println(propName+"===================");
        AppConfigPropertyHelper.props.put(propName, prop);
        System.out.println("listent init ok======================");
        System.out.println("Map props="+AppConfigPropertyHelper.getProps());

 }

 /**
  * 获取属性值
  * @param propName
  * @param key
  * @return
  */
 public static String getPropertyByName(String propName,String key){
  Map<String, Properties> m = AppConfigPropertyHelper.getProps();
  Properties p = (Properties)m.get(propName);
  if(p == null){
   return null;
  }else{
   return p.getProperty(key);
  }
 }
 /**
  * @return the props
  */
 private static Map<String, Properties> getProps() {
  return AppConfigPropertyHelper.props;
 }
}

这种方法是对方法一的改造,把变量属性的初始化放在contextInitialized,这样就需要配置一个listener,好处是可以在we.xml以配置的方式实现加载那个(或那几个)属性文件

方式三

利用Spring的PropertyPlaceholderConfigurer 加载属性文件,配合一个配置的bean,每一个配置项都是这个bean的一个属性(类似dataSource的实现)

例如:

package fun.util;
public class SysConf {
 private String theme;
 public SysConf() {
  super();
  // TODO Auto-generated constructor stub
 }
 /**
  * @return the theme
  */
 public String getTheme() {
  return theme;
 }
 /**
  * @param theme the theme to set
  */
 public void setTheme(String theme) {
  this.theme = theme;
 }
} 

这种方式利用spring的PropertyPlaceholderConfigurer 去加载属性的值,需要配置bean对应属性文件的中key 建立相应的成员变量。在spring的容器里面也要配置这个bean。

此方法改造,可以在bean只放一个属性文件的地址,在bean里面做类似方法一的做法,解决一中的不足。缺点还是要在spring中配置bean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值