alogic是一个高效的,可扩展的,轻量级服务框架。在这个框架中,一个JAVA开发者可以快速的开发出实现自己业务的服务,本文介绍服务在框架中是如何加载的。
一 从web.xml开始加载
父类WebAppContextListener重写了contextInitialized和contextDestroyed方法。 在contextInitialized方法中,做了如下事情
- 初始化了一个DefaultProperties并将servlet上下文的一些信息写入
- 加载servlet的运行参数并写到DefaultProperties
- 更新web库文件
- 获取classloader来加载类(默认是LogicBusApp)并创建实例
- 执行初始化、装入其他context并启动应用
三 LogicBus的初始化
LogicBusApp是WebApp的实现类,可以说是整个alogic应用的基础。在进行初始化的时候,主要是对配置文件进行加载和注册。加载指的是创建一些对象或获取实例,注册指的是在Settings类中进行输入。 Settings类其实并不陌生,它是一个配置变量的K-V集合,主要用来维护当前alogic web项目的全局变量集合和对象列表,其关系图如下:
可以看到,Settings是DefaultProperties的子类,DefaultProperties维护缺省的变量集,而Settings维护了当前项目的变量集,这种设计很符合里氏替换法则。由于Settings是针对在当前唯一的web项目,因此采用单例模式进行设计,来保证全局仅有唯一的实例。
在LogicBusApp中,初始化调用init方法,其实现逻辑如下:
- 获取一个Settings的单例,并将前文中的DefaultSettings内的参数注册进来。
- 在Settings中注册当前的classLoader
- 装入ketty.web.xml(默认为${ketty.home}/conf/ketty.web.xml)并将该xml解析,解析后的参数注册到settings中。
- 装入ResourceFactory(默认为com.anysoft.util.resource.ResourceFactory)并创建resourceFactory对象,同时在Setting中注册了resourceFactory。
- 装入其它配置xml文件并注册到Settings中
- 执行onInit方法
到此为止,在Settings中已经注册了各种配置信息,接下来要在onInit方法中执行初始化,onInitBizLogger负责初始化项目的AccessControlle(权限控制),BizLogger(业务日志),MetricsHandlerFactory(指标处理器)和ServantFactory(服务工厂),其中最重要的就是ServantFactory,通过如下方式初始化ServantFactory:
在第一行ServantFactory sf = ServantFactory.TheFactory.get(settings)中,该方法初始化步骤如下:
- 寻找默认的加载配置文件(默认为com/logicbus/backend/servantfactory.default.xml)
- 解析加载并创建一个ServantFactory的实例
四 ServantFactory的初始化
在整个web项目初始化过程中,ServantFactory的初始化是一个关键的步骤。Alogic是针对服务开发的一套框架,在这个框架中,服务具体体现在Servant类,而ServantFactory则是Servant的一个工厂接口。
在上一节中LogicBusApp的onInit方法中,最后通过如下方式初始化ServantFactory:
在第一行ServantFactory sf = ServantFactory.TheFactory.get(settings)中,该方法初始化步骤如下:
- 寻找默认的加载配置文件(默认为com/logicbus/backend/servantfactory.default.xml)
- 解析加载并创建一个ServantFactory的实例
ServantFactory的实现类是QueuedServantFactory,
在alogic 1.6版本中,采用WebAppContextListener作为上下文监听器,后版本拓展了该类。父类WebAppContextListener重写了contextInitialized和contextDestroyed方法。 在contextInitialized方法中,做了如下事情
- 初始化了一个DefaultProperties并将servlet上下文的一些信息写入
- 加载servlet的运行参数并写到DefaultProperties
- 更新web库文件
- 获取classloader来加载类(默认是LogicBusApp)并创建实例
- 执行初始化、装入其他context并启动应用
至此,应用就被成功加载了。