在两个Web应用程序之间共享服务,访问资源(例如属性文件),而不在两个Web应用程序中复制代码,最有效的设计模式/编码实践是什么?
在Tomcat上运行的两个Web应用程序,每个应用程序都读取Tomcat的context.xml中的属性文件和一些环境条目。这很好,但基本上我只复制了读取两个Web应用程序的代码。像这样重复代码是好的设计和/或编程实践吗?
我考虑过创建一个包含服务(它们的接口和实现)的JAR文件,以及一个单独的单元,它将成为获取服务的入口点。我已经阅读并搜索并想出了一个单身人士:
public class PropertyService {
private static volatile ExternalPropertyService eps;
private static volatile SettingsPropertyService sps;
private static volatile AuditPropertyService aps;
private PropertyService () {
}
private static class ServiceHolder {
private static final PropertyService propertyService = new PropertyService();
}
public static PropertyService getInstance() {
return ServiceHolder.propertyService;
}
public ExternalPropertyService getExternalPropertyService() {
ExternalPropertyService tmp = eps;
if (tmp == null) {
synchronized(this) {
tmp = eps;
if (tmp== null) {
tmp = new ExternalPropertyServiceImpl();
eps = tmp;
}
}
}
return tmp;
}
// Rest of the property member accessors omitted
}
Singleton是延迟加载的(按需初始化)并且服务也是延迟加载的(双重检查锁定)。基本上单身就是包装服务。拥有它需要甚至是明智的吗?服务读取,缓存和刷新值,它们是同步的和线程安全的。
如果我将此JAR放在Tomcat的公共文件夹中,它将由公共类加载器拾取并可供两个Web应用程序使用。这两个Web应用程序也会使用与普通类加载器相同的单例吗?它是线程安全的吗?从我可以收集到的应该是。
我在这里做错了吗?有没有更好的方法呢?