什么是模块化
在计算机科学中模块化的概念是“将大型系统分为多个互相联系的逻辑单元,并强制设定各个模块的逻辑边界来改善系统的维护性和封装性”,也就是说模块将一些类封装在模块中,而将一些需要给外部使用的类暴露出来给外部使用
为什么要模块化
大家可能认为Java中的OO思想不也提供了这种功能吗,为什么要使用OSGI的模块化了?Java的面向对象设计,的确实现了类似的功能,但是其本身是存在一定的缺陷的。首先大家看看下面的例子,其中有三个java文件:org.serc.helloworld.Hello.java:定义了一个接口
package org.serc.helloworld; public interface Hello { void sayHello(); }
org.serc.helloworld.impl.HelloImpl.java:实现了Hello接口
package org.serc.helloworld.impl;
import org.serc.helloworld.Hello;
public class HelloImpl implements Hello{
final String helloString;
public HelloImpl(String helloString){
this.helloString = helloString;
}
public void sayHello(){
System.out.println(this.helloString);
}
}
org.serc.helloworld.main.Main.java
package org.serc.helloworld.main;
import org.serc.helloworld.Hello;
import org.serc.helloworld.HelloImpl;
public class Main{
final String helloString;
public static void main(String[] args){
Hello hello = new HelloImpl(“Hello,SERC!”);
hello.sayHello();
}
我们可以看出,在main方法中引用了Hello接口的sayHello方法,但是为了实例化这个接口却引进了HelloImpl这个类,这里明显破坏了封装性的特点,或者你会说可以使用工厂模式来改善这个问题,但是这又会花费多余的开销,而OSGI的模块化却能很好的解决这个问题。而且我们在java中的classpath添加类时,不能直观的看到导入jar包的版本和其所依赖的其他jar包。
OSGI模块层基础
在OSGI的模块中回大量的创建和维护大量的Bundle。Bundle是以jar包形式存在的模块物理单元,包含了Class文件、资源文件和元数据(metadata);更好的理解是:在jar包中的MANIFEST中加入了对Bundle的特征之后,这个jar包就成为了Bundle。如图:
Bundle中的元数据可以分为三个部分:
1 可读信息(可选):更好的理解Bundle
2 Bundle的标示符(必须):Bundle的唯一标识符
3 代码的可见性(必须):定义内部与外部代码