首页 > 代码库 > OSGI学习总结
OSGI学习总结
最近学习了解了一下OSGI技术,感觉OSGI虽然有一定的学习难度,但是最终掌握和推广之后将是一项对系统开发比较有用的技术。在此和大家分享一下自己的感悟。
1、什么是OSGI
OSGI直译为“开放服务网关”,是一个由OSGI联盟发起的以Java为技术平台的动态模块化规范。目前主要的实现有:apache的Felix、Eclipse的Equinox等
2、使用OSGI的好处
OSGI可以看作是一种做系统架构的工具和方法论,能够让系统开发和设计人员以模块化的思想来开发和设计系统。
在以往的基于Java的系统开发过程中不能有效地约束程序员按照一定的层次和依赖关系进行类或接口之间的调用,导致整个系统越来越难以理解和维护,系统发展到后期就会出现维护时,牵一发而动全身的情况出现。而OSGI框架或者说OSGI容器能够以导入、导出包的形式来控制模块之间的依赖,对模块间依赖有更强的约束力,也更加方便管理依赖。
例如在你的Jar包中有一个com.ynet.service.UserService接口,这个接口有一个相应的com.ynet.service.impl.UserServiceImpl实现类,在传统的开发中,你无法阻止其他人将UserService向下转型为其实现类,并进而调用那些没有在接口中定义的方法,这些方法原本是你不打算暴露给外部的。
现在基于OSGI框架开发的话,在此Jar包中添加一个OSGI元数据定义文件,你只有将com.ynet.service这个包 export出去,外部模块才能调用到这个包中的类或接口,由于你没有将com.ynet.service.impl导出,外部将无法引用到UserServiceImpl类。
对于开发和设计人员来说,最重要的就是如何将适当的类耦合为一个模块,以及如何暴露适当的package。
目前OSGI规范包含了许多常用的子规范如用户管理服务规范、日志服务规范、Http服务规范等等。我们在开发中使用他人开发的规范实现的话,可以加快开发进度,避免“重复制造轮子”。即使我们选择自己来实现这些规范的话,由于规范的引导,也可以开发出功能比较完善、易于使用和扩展的服务实现。
另外,OSGI能够提供动态部署和维护系统的能力,这对于一些对停机限制非常严格的系统来说很有用。可以在不停机的状态下增加或禁止某项功能、更新某个模块。
3、OSGI大概运行机制
OSGI容器对模块间依赖的控制,是通过隔离Java类加载器来实现的。不同的模块具有不同的类加载器。如模块A中有个类User依赖了模块B中的类Address,那么在模块A中加载Address类时,将委托给模块B的类加载器来完成。
4、OSGI对企业级开发的支持
OSGI企业级规范中定义了JDBC、JPA、JMX、JTA和JNDI等各种Java EE技术以及一些非Java EE标准的企业级技术,目前已经有不少OSGI企业级服务实现框架如Apache Aries。
实际的OSGI使用远不止上面说到的这些,需要深入地学习和解决更深层、更复杂的问题,如:声明式服务的使用来与OSGI框架解耦,在OSGI中整合非OSGI的Jar包等。本人目前也是处在理论学习和一些代码样例的调试阶段,以上内容如有偏差,希望不吝赐教,共同学习。