OSGI浅谈
1. Java模块化的发展
osgi是Java动态模块化的标准,对Java的发展起到了推动性的作用,osgi却没有被官方认可【oracle公司想从更底层解决动态模块化面临的问题】。直到Java9中Java原生的模块化才正式上线,对jdk进行了模块化的重构,引入了platformClassloader。但jagsaw相对于OSGI,无论是功能上,还是成熟度上都是难以比拟的。
比起OSGI带来的好处,过高的使用门槛、研发成本等问题,没有让OSGI流行起来。
我常常思考动态模块化对于Java来说到底带来了什么?
——量化边界【模块间的耦合性】,代码间不能在随意的耦合。
2. bundle
bundle是OSGI组成单元,每一个bundle都有独立的生命周期,系统bundle负责bundle的管理。bundle有了生命周期是一个多么激动的事情!
这个样就可以自由的安装、卸载功能了。
3. 昙花一现的springDM
Spring很早就开始支持osgi,并发布了springDM模块,springDM允许进程内创建多个隔离的spring-context。一向以简化使用存在的spring,并没有有效降低osgi框架的使用难度。导入、导出、启动乱序,启动时间长等问题仍然突出。因此springDM没有流行起来,spring官方决定将springDM捐给了eclipse社区,从此springDM的使命就此完结。
4. 隔离性的思考
bundle肩负着隔离性的具体实现,体现在两个方面:类的隔离性行,服务的隔离性。前者通过类加载器实现,后者通过多spring-context来实现。无论是哪一种隔离性,都把资源的访问变得可以控制。bundle之间的类和实例的引入都需要显示的声明,而传统的方式,同一个文件夹下的jar包里面的类是可以任意访问的,任意访问意味着不可控,意味着jar之间的耦合关系难以量化。说到这里你也许会说,maven之间的依赖不是可以描述依赖关系吗?但是我想说:maven确实可以描述的依赖关系,但是这种关系太粗了,要想了解类一级的依赖关系还需要去看源码。而osgi确可以通过配置文件把这个依赖【或者说耦合】量化。