APDPlat接管了Spring的启动关闭权,为各种运行其上的开源框架和类库的无缝集成提供了支持。
当然,大家都知道,一个JAVA EE Web应用的入口点是web.xml,APDPlat当然也不例外,我们看看APDPlat是如何接管Spring的启动关闭权的:
<listener> <description>经过定制的spring监听器</description> <listener-class>org.apdplat.platform.spring.APDPlatContextLoaderListener</listener-class> </listener>
/** * 自定义Spring的ContextLoaderListener * @author 杨尚川 */ public class APDPlatContextLoaderListener extends ContextLoaderListener { @Override public void contextInitialized(ServletContextEvent event) { //接管系统的启动 SystemListener.contextInitialized(event); super.contextInitialized(event); } @Override public void contextDestroyed(ServletContextEvent event) { //接管系统的关闭 SystemListener.contextDestroyed(event); super.contextDestroyed(event); } }
在Spring启动和关闭之前,都会先调用org.apdplat.module.system.service.SystemListener来做预处理。
这只是接管启动和关闭权,关于无缝集成所做的定制请看org.apdplat.platform.spring、org.apdplat.platform.struts、org.apdplat.platform.compass这三个包里面的类,这里不做说明。
本文主要分析SystemListener在系统启动和关闭的时候都分别做了什么处理。
系统启动流程:
1、获取ContextPath
contextPath=sce.getServletContext().getContextPath();
public static String getContextPath() { return contextPath; }
在部署APDPlat的时候,可能会有两种情况:一是部署在ROOT目录下,ContextPath为空,则地址为http://192.168.0.100;二是部署在非ROOT目录下,假设ContextPath为APDPlat_Web,则地址为http://192.168.0.100/APDPlat_Web。前端EXT JS和JSP以及后台服务在处理绝对路径和记录日志等情况的时候需要知道ContextPath的值,该值在系统启动的时候从应用服务器中获得,保存为静态变量,并通过静态方法暴露给系统使用。
2、获取RealPath
basePath=sce.getServletContext().getRealPath("/"); FileUtils.setBasePath(basePath);
整个APDPlat系统中的文件操作都以basePath为基础,通过basePath的值,我们可以得知Web应用存放在服务器上面的本地磁盘绝对路径,如:D:\Workspaces\NetBeansProjects\APDPlat2.5\APDPlat_Web\target\APDPlat_Web-2.5\,这样我们就可以对Web应用中的所有文件进行IO操作。
3、改变系统属性user.dir的值
userDir=FileUtils.getAbsolutePath("/WEB-INF/classes/data/"); System.setProperty("user.dir", userDir);
把user.dir重新指定到Web应用的/WEB-INF/classes/data/目录,此目录会存放索引文件,初始导入的数据文件。
4、为spring的配置做预处理
public static void prepareForSpring(){ //供spring扫描组件用 String basePackage=PropertyHolder.getProperty("basePackages"); String localBasePackage=PropertyHolder.getProperty("basePackages.local"); if(StringUtils.isNotBlank(localBasePackage)){ basePackage=basePackage+","+localBasePackage; } System.setProperty("basePackage", basePackage); }
这里为用户在项目中自定义扫描组件的范围提供支持,用户可在config.local.properties配置文件中定义变量basePackages.local的值为自己的包名称。
5、注册模块
Enumeration<URL> ps = Thread.currentThread().getContextClassLoader().getResources("META-INF/services/module.xml");
根据模块描述文件module.xml识别类路径下的所有模块,注册模块,提取web资源和数据,为后续的组件扫描、模块初始化、数据库同步做准备。
6、解析所有的dic.xml文件,并生成供客户端EXT JS调用的文件
DictionaryGenerator.generateDic(basePath);
7、记录服务器启动日志(如启用)
//保存服务器启动日志 BufferLogCollector.collect(runingTime);
8、启动内存监视线程(如启用)
int circle=PropertyHolder.getIntProperty("monitor.memory.circle"); memoryMonitorThread=new MemoryMonitorThread(circle); memoryMonitorThread.start();
系统关闭流程:
1、记录用户注销日志(如启用)
UserLoginListener.forceAllUserOffline();
2、记录服务器关闭日志(如启用)
//保存服务器关闭日志 BufferLogCollector.collect(runingTime);
3、停止内存监视线程(如启用)
memoryMonitorThread.running=false; memoryMonitorThread.interrupt();
4、处理缓冲区中的日志
//在关闭系统之前,处理缓冲区中的日志 BufferLogCollector.close();
5、卸载JDBC驱动
private static void deregisterDrivers() { Enumeration<Driver> drivers=DriverManager.getDrivers(); while(drivers.hasMoreElements()){ Driver driver=drivers.nextElement(); try { DriverManager.deregisterDriver(driver); } catch (SQLException e) { LOG.warn("卸载JDBC驱动失败:"+driver, e); LOG.warn("Fail to uninstall JDBC driver:"+driver, e, Locale.ENGLISH); } } }
相关推荐
通过对Linux系统启动流程的详细分析,我们可以看出这是一个多层次、多步骤的过程。从硬件的上电自检到BIOS引导,再到Boot Loader的加载和内核的启动,每一步都至关重要。了解这些基础知识不仅有助于更好地理解和使用...
标题“IMX8 Uboot 2019启动流程分析”指的是对NXP i.MX8系列处理器所使用的U-Boot引导程序的启动流程进行详细分析。本分析涵盖了从Boot ROM固化程序开始,一直到SPL(Secondary Program Loader)程序和U-Boot主体...
1. **系统启动与登录**:流程始于用户打开教务管理系统并进行登录。系统会对用户的账号信息进行验证,确保只有授权的人员(如教师、辅导员、学生或管理员)能够访问。 2. **身份权限判断**:登录成功后,系统会根据...
本文将深入探讨Sifive结构CPU上的U-BOOT整个系统运行流程,以及相关的源代码分析。 一、U-BOOT简介 U-BOOT是通用的开放源码Bootloader,主要任务是在操作系统启动之前,为系统设置基本环境,如内存初始化、设备检测...
《OA流程时效性分析报告》是对企业OA系统中流程流转时效的深度剖析,旨在解决流程未归档问题,提升工作效率。报告主要分为三部分:数据收集情况汇总、数据收集情况分析以及优化措施与方案。 首先,报告展示了截至...
了解U-Boot在基于RISC-V体系结构的单板计算机(SoC)上的启动流程,对于嵌入式系统开发人员来说是非常重要的。 首先,U-Boot的启动流程开始于低级初始化函数lowlevel_init。这个函数通常是由特定硬件平台所定义的,...
Android 操作系统的启动流程是一个复杂的过程,涉及到多个组件和服务的协作。AMS(Activity Manager Service)是 Android 中的核心组件,负责管理应用程序的生命周期、进程间通信、Intent 解析等功能。在 AMS 的启动...
指纹启动流程详细流程图分析
社团管理系统系统分析 社团管理系统是为了管理好会员参加社团情况等信息而设计的。...系统分析的过程中,我们需要了解系统的背景、目的、意义和需求,并且需要了解系统的业务流程、数据流程和 E-R 模型。
如果使用"电脑启动和关闭事件查看器.exe"这个工具,可能提供了更直观、简洁的方式来查看这些特定事件,使得用户更容易理解和分析电脑的启动和关闭过程。这种工具对于排查电脑启动问题、优化启动时间或追踪不正常关机...
操作系统启动原理分析主要聚焦在Windows XP的启动流程上,这一过程是理解操作系统核心机制的关键环节。Windows XP作为基于NT技术的系统,与早期的DOS、Windows 3.x、9.x和ME等有很大区别,因为它彻底摆脱了字符界面...
RHEL6 开机启动流程分析图 图解rhel6开机启动流程
在系统分析与设计实验中,工作流程图是至关重要的工具,它能清晰地展示系统的各个功能模块及它们之间的交互关系,帮助开发者理解和构建系统。 首先,我们来看“宿舍管理系统-学生信息添加.vsd”文件,这通常是一个...
本文将深入剖析Android系统的通话模块,重点分析来电与去电的具体流程,包括从应用程序层面到框架层面的关键步骤和技术细节。 #### 二、拨出电话(语音电话)流程详解 拨出电话的过程涉及多个层次的交互,从用户...
在Android操作系统的世界里,了解其启动流程是至关重要的,尤其是对于开发者来说,这有助于优化应用性能和理解系统行为。本文将深入探讨Android系统的启动过程,包括Zygote进程的孵化和SystemServer的角色。 首先,...
业务流程分析是指对管理信息系统的业务功能和流程进行分析和描述。在高校图书馆业务流程图中,我们可以看到读者借书的业务流程,包括读者凭借借书证进入图书馆门禁系统、查询机查找所借书籍是否在馆、查看书籍索取号...
通过对QEMU启动虚拟机流程的深入分析,我们可以了解到QEMU如何通过一系列复杂但有序的步骤来构建和运行虚拟机环境。这种精细的分层设计使得QEMU既强大又灵活,能够在各种场景下发挥出色的表现。
例如,在reset异常处理部分,就会有关闭FIQ和IRQ中断,防止错误中断打断正常启动流程的操作。 UBOOT的启动过程是一个复杂但有序的步骤序列,涉及到处理器、内存、外设等硬件资源的初始化。通过以上详细的步骤解析,...
"易语言系统启动项管理源码"是指使用易语言编写的程序,用于管理和控制计算机的系统启动项。在Windows操作系统中,系统启动项是指在用户登录或计算机启动时自动运行的程序或服务。通过管理这些启动项,用户可以优化...
工作流程-工作流程系统-工作流程系统源码-工作流程管理系统-工作流程管理系统java代码-工作流程系统设计与实现-基于springboot的工作流程系统-基于Web的工作流程系统设计与实现-工作流程网站-工作流程网站代码-工作...