最近把lightportal代码down下来一份,运行了一把,看的不多,但是被系统中一个小小的功能点吸引住了,感叹作者优秀的设计能力的同时,也在反思自己设计上的问题。
先来看下这个小小小小的东东是什么,做过项目的同学都知道,有些资源是需要在系统加载时就要被启动起来的,而且这些东西只需要启动一次,运行时程序只要直接读取就可以了,在j2ee中,一般都用Listener来实现(实现ServletContextListener)将初始化操作写在对应的contextInitialized方法中,大家常用的用于启动Spring容器的org.springframework.web.context.ContextLoaderListener。但是系统的需求总是在变化的,最初Listener初始化中的逻辑可能并不能满足后期业务发展的需要,怎么办呢?那就改吧,在contextInitialized方法中添加一块又一块的补丁--这也是最经常能想到的,更好一些的解决方案是把新增的需求写在另一个listener中,然后在web.xml中配置一下,这个是个不错的解决方案,对于方案1来讲已经进步了很多了--将变动的东西封装到了新的类里,也遵守软件设计的开闭原则,对旧类屏蔽了改动,而只作功能的增加。
同一个业务系统对不同的用户可能有不同的需求,如客户1可能希望系统初始化时就把一些资源加载到本地,允许有一些数据上的不同步性,有些用户则对数据同步有严格要求,希望系统初始化时永远不要搞这些操作或者有些自己的特殊需求,怎么办?看来方案2也不能很优雅的解决这个问题。这时候我们来看下lightportal是怎么解决这个问题的:
首先,还是定义一个系统Listener,在contextInitialized方法中执行初始化造作--呵呵,用的还是最基本的j2ee的东西吗
再次,怎么做到通用与个性化的平衡?仔细看contextInitialized方法中,其实没有任何的业务处理代码,只是一个简单的循环!!业务逻辑代码哪里去了?被封装到一个个具体的类里去了!不过这些类都有一个统一的接口,启动时执行哪些类是定义在配置文件中的,来细看下
配置文件config.properties
events.startup=/
org.light.portal.core.event.StartupEventImpl
这个配置文件有点意思,为什么用/然后另起一行?当一个key有多行的文本值时就需要这么配置了
然后看程序处理逻辑
public class ApplicationListener implements ServletContextListener ....
public void contextInitialized(ServletContextEvent ce) {
try{
for(String event : _EVENTS_STARTUP){//这个_EVENTS_STARTUP就是从配置文件中读取的events.startup的值,
Object eventObject = Class.forName(event).newInstance();;//利用java的反射机制来生成具体对象
if(eventObject instanceof StartupEvent){
StartupEvent startupEvent = (StartupEvent)eventObject;
startupEvent.execute(ce.getServletContext());//执行具体的逻辑
}
}
}catch(Exception e){
logger.error(e.getMessage());
}
}
总结下这样的实现好处在哪里?
1.变动的只是配置文件
配置文件本来就是为了变化而生的,程序的骨架逻辑不会放声任何改动--只是一个再简单不过的for循环,个性的功能在配置文件中得以体现
2.对修改关闭,对扩展开放
统一上层接口--StartupEvent,新功能在子类中实现,程序骨架只对上层接口造作,不关系具体的实现类--对接口编程的优秀实践
3.java反射机制
java发射机制为动态加载类提供很好的实现方案,在配置文件中配置类的完成路径名,然后反射机制加载具体对象,这个时候反射带来的效率牺牲不值一提
分享到:
相关推荐
系统预留带宽 系统预留带宽 系统预留带宽
预留洞辅助设计系统详细设计过程!
云计算系统虚拟机内存资源预留方法.pdf
预留是对未来发货的一个计划,它包括了数量,还有发货时的移动类型,这样在发货时可以参照。 另外,预留还可以在运行物料需求计划时触发需求
如果用传统数据库设计模型,那么在设计初始阶段就必须 考虑到应用未来所有的改变及扩展,尽可能使表格的信息详尽,否 则当应用发生改变或扩展时,必须重新设计表结构,并对应用程序 中相关片段全部重写。如果同一...
SAP 预留 表关系 by Tiger
GRASS文件预留系统是BES数据管理系统的有机组成部分 存在问题 GRASS的迁移策略:存储池水位和迁移时间间隔(系统级的因素) 没有全面考虑用户的使用模式与需求 采取的措施 基于用户级的数据迁移,生成用户指定的文件...
****大学新校区建设是逐步进行的,在建设初期必须考虑室内外管道系统的预留满足建成后各个系统需要,避免将来系统扩展时没有足够的预留管道,从而破坏整体建筑结构以及装修等。 综合管道的建设是基础建设的一部分,...
目 录 一、总体概述 3 1.1 工程概述 3 1.2 需求分析 3 1.3 设计范围 3 二、设计依据与原则 3 2.1设计依据 3 2.2设计原则 3 三、设计方案 7 3.1设计目标 7 3.2总体功能目标 7 3.3系统结构 8 3.4系统设计要点 8 3.4.1...
预留概念解析.docx预留概念解析.docx预留概念解析.docx预留概念解析.docx预留概念解析.docx
SAP 预留单 具体东西要领用时怎么作业
基于MATLAB的FBMC系统子载波预留实现 An implementation of tone reservation scheme for FBMC system.
现代社会科学技术的发展可以说是突飞猛进,很多传统的...但系统预留了足够的扩展空间,并提供了简单的扩 展方式供参考,实际使用中可根据需要改成多路转换,既可以增加湿度等测控对 象,也能减少外界因素对系统的干扰。
35 5.3.4 气库出入库过程场景分析 36 5.3.5 代储业务场景分析 37 5.3.6 结算过程场景分析 38 5.3.7 配送场景描述 39 B2C-电子商务平台系统设计全文共41页,当前为第2页。5.3.8 价格管理场景描述 40 B2C-电子商务平台...
根据源路由方式的特点,将域内资源预留方案扩展到多域ASON中,形成三种域间资源预留方案:域间保守前向资源预留、域间贪婪前向资源预留和域间后向资源预留。仿真结果表明,随着网络负载的加大,域间贪婪前向资源预留...
Amazon EC2 预留实例和其他预留模型
通过介绍刨煤工作面收尾期间预留回撤巷技术在实际生产中的经验做法及应用效果,着重对预留回撤巷道的施工方法、注意事项、技术要求以及支护参数进行了分析,给出了回撤通道的支护方案。并结合预留回撤巷技术在小青煤矿...
Book Manager图书借阅管理系统设计使用说明书 一、图书借阅管理系统的主要功能是对在库图书的借阅进行统计和管理,对已经借阅的图书进行归还操作,并对图书借阅状态进行同步更新。 二、设计系统管理员对系统运行(如...
养老预留金计算器,就出生年月计算出预留金额养老使用。
预留预埋监理细则