背景说明
Tomcat作为一款应用非常广泛的服务器,错误信息提示肯定要做国际化支持。Tomcat将错误信息保存到properties文件中,并且由于Tomcat的类比较多,如果将所有类的错误提示信息都维护到同一个properties文件中,那将是一场噩梦。Tomcat在每一个包中,都有一组properties文件,来保存当前包中类的错误提示信息。图1是包org.apache.catalina.connector中错误提示信息配置文件列表
LocalStrings.proerties中部门内容如图2
源码分析
Tomcat使用类StringManager来管理错误提示信息,我们可以通过下面代码来获取其对象。
/**
* The string manager for this package.
*/
protected static final StringManager sm =
StringManager.getManager(Constants.Package);
其中Constants.Package常量定义了当前类所属包的包名。
方法getManager的实现
private static final Hashtable<String, StringManager> managers =
new Hashtable<String, StringManager>();
/**
* Get the StringManager for a particular package. If a manager for
* a package already exists, it will be reused, else a new
* StringManager will be created and returned.
*
* @param packageName The package name
*
* @return The instance associated with the given package
*/
public static final synchronized StringManager getManager(String packageName) {
StringManager mgr = managers.get(packageName);
if (mgr == null) {
mgr = new StringManager(packageName);
managers.put(packageName, mgr);
}
return mgr;
}
由以上代码可以看出,StringManager为每个package创建一个对象,并通过内部的HashTable类型的私有变量managers来管理,显然,这采用了对象的<b>多例模式</b>。
多例模式
说到对象的多例模式,我们会很容易想到它的两个特点:
- 类可以拥有多个实例
- 类本身创建、管理自己的实例(与单例模式一样,不对外提供构造方法)。
相关阅读:
本文首发在 刘振锋的简书博客 原文地址为《Tomcat错误信息管理-StringManager》转载请注明!