org.apache.felix.framework-5.6.12源码解析——*framework中dto,hook,launch,namespace,startlevel部分

Posted ku1274755259

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了org.apache.felix.framework-5.6.12源码解析——*framework中dto,hook,launch,namespace,startlevel部分相关的知识,希望对你有一定的参考价值。

DTO

Felix中使用了DTO模式,在传统的编程中,我们一般都是前台请求数据,发送到Webservice,然后WebService向数据库发出请求,获取数据,然后一层层返回;模型如下:

技术图片

这种比较原始的请求方式带来的缺点有很多,多次请求耗费一定的网络资源,减慢效率。如果一次性返回整个实体类,还可能造成数据库表结构的泄漏。

 

DTO模型

 技术图片

这样带来的好处有:

1.依据现有的类代码,即可方便的构造出DTO对象,而无需重新进行分析。

2.减少请求次数,大大提高效率。

3.按需组织DTO对象,避免传输整个表的字段,一定程度上提高了安全性。

 

Hook

技术图片

 

Weaving Hook让用户模块可以获得在其他类加载时动态植入增强的能力。

Resolver Hook和Bundle Hook代替了以前的OSGi框架嵌套和组合模块的功能,让用户可以创建虚拟的模块集合,使不同集合之间的模块互不可见这点在OSGi R5中提供了更完美的解决方案。

Service EventListener Hook让用户可以插手服务事件分派的过程。

这部分也体现了OSGI模块化的高耦合,低内聚的特点。

 

StartLevel 

技术图片

 

 

用于查询和修改启动级别信息。

OSGi的start level是一个数字,用来定义模块的优先级,告诉负责OSGi 生命周期的容器 (Equinox Container),某个特定的模块应该在什么时候被启动。这个数字越小,代表模块的优先级越高。只有所有高优先级的模块都被完全执行后,才会开始执行低优先级的模块。

在整个容器启动的时候,会扫描所有模块的start level,然后从数字最小(优先级最高)的模块开始执行。具有相同start level的模块的执行顺序是不可控制的,默认的模块start level是4。

1.框架有激活启动级别(active start level),用于确定可以启动哪些bundle。

2.bundle都有一 个bundle启动级别(bundle start level)。

技术图片

OSGi拥有动态模块的特点,不同的Bundle有着独立的生命周期,可以独立进行安装、启动、停止、卸载的操作,

1、  采用容器的架构思想 

利用容器来组织业务组件、对象,管理和协调组件之间的关系。容器是框架的核心,它提供了组件植入的规范机制,让组件具有生命,提供给组件呼吸的空气。OSGi容器,实现了OSGi Framework 规范的要求,。一般采用逻辑分层描述其主要实现的功能如下:

L1——模块层:定义了组件的装载(Classloader)机制,管理组件之间的隔离、依赖与协作;它在Java的类装载机制上加入了模块化的概念。

L2——生命周期管理层:负责运行时组件的生命周期,包括动态安装、启动、停止、更新或卸载组件,同时容器提供了运行时管理组件的API。

L3——服务注册层:提供了一个让组件动态注册服务的模型,同时组件可以发现、使用服务。

基于容器机制,便于组件的统一组织和协调;同时让容器提供基础服务,组件只需要关注业务和实现。OSGi容器类似JBoss、Spring容器一样,提供了运行环境,同时让使用者有机可乘,通过API能扩展、监听容器的执行情况。

2、  基于组件的开发思想

OSGi框架鼓励基于组件、分模块开发的思想来实现应用项目,要求以组件的方式来规划、设计、实现项目。OSGi框架还提供了很多基于组件开发的服务,让这些组件在其容器中能有机地结合,良好地运转。主要几方面如下:

(1)、基于OSGi框架开发,模块都必须以组件(Bundle)的方式来组织开发和部署。

(2)、模块可单独形成一个工程,工程之间可没有依赖关系,在运行时,可动态选择需要加载的Bundle。

(3)、模块可动态部署、更新和管理。项目运行期间,可动态卸载模块、更新模块。

(4)、每个模块对应一个Bundle,它采用的是独立的Classloader机制,不能采用传统的引用其他Bundle的工程来实现Bundle间的协作。

(5)、每个Bundle可提供BundleActivator去控制自己的生命周期,完成在Bundle启动、停止时所需要进行的工作,同时可发布或者监听整个框架的事件状态信息。

采用OSGi框架,以组件的形式来开发项目,能更好地解决了模块之间的耦合性、消除循环依赖,提高了模块的稳定性,便于以增量的方式来完成项目。

3、  组件之间的服务思想

OSGi期初,主要是以包依赖的方式来实现,包括输出包到OSGi容器、引用容器里其他组件输出的包、引用容器里的其他组件;OSGi 又推出声明服务(Declarative Services)的方式来更加灵活地组织应用系统,解耦组件之间的依赖关系。

采用声明服务(由Java接口定义)的方式,OSGi主要利用了面向服务(Service-Oriented)的思想,组件可以通过组件上下文注册对外提供的服务,同时也可以通过组件上下文来获得需要引用的其他服务。采用面向服务的方式可以使得对外提供的服务能够更加的封闭,不需要为了使用别的组件提供的服务而做环境依赖等的设置。

 

以上是关于org.apache.felix.framework-5.6.12源码解析——*framework中dto,hook,launch,namespace,startlevel部分的主要内容,如果未能解决你的问题,请参考以下文章