您的位置:首页 > 其它

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

2015-08-17 23:21 441 查看

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

在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息