-
创建一个新的
java project,命名为ServiceProvider -
在
com.freud.service包下创建一个新的interface,命名为HelloWorldService
package com.freud.service;
public interface HelloWorldService {
public void sayHello(String name);
}- 在
com.freud.service.impl包下创建一个新的java类,命名为HelloWorldServiceImpl
package com.freud.service.impl;
import com.freud.service.HelloWorldService;
public class HelloWorldServiceImpl implements HelloWorldService {
@Override
public void sayHello(String name) {
System.out.println("Hello," + name);
}
}- 在
src下新建一个Folder,命名为META-INF,并在META-INF下创建一个folder命名为services,一个文件命名为MANIFEST.MF
Manifest-Version: 1.0- 在
services目录下创建一个文件命名为com.freud.service.HelloWorldService其中的内容为:
com.freud.service.impl.HelloWorldServiceImpl-
将项目导出为
jar到一个本地目录,命名为ServiceProvider.jar -
新建一个
Java Project,命名为ServiceConsumer,并添加ServiceProvider.jar为外部jar依赖 -
在
com.freud.service.test目录下添加一个测试类HelloWorldTest
package com.freud.service.test;
import java.util.Iterator;
import java.util.ServiceLoader;
import com.freud.service.HelloWorldService;
public class HelloWorldTest {
public static void main(String[] args) {
ServiceLoader<HelloWorldService> serviceLoader = ServiceLoader
.load(HelloWorldService.class);
Iterator<HelloWorldService> ite = serviceLoader.iterator();
while (ite.hasNext()) {
ite.next().sayHello("World");
}
}
}- 执行测试类
| 总结 | 当Consumer类调用HelloWorldService的时候,并不需要去关注在Provider中的服务具体实现是什么,而是只需要去关注Service的接口就可以了,对接口的实现在Provider中。 |
| 缺点 | 实现类在打包发布之后,还是暴露给了Consumer,而这对Consumer来说,是完全没有用的东西。 |
参考资料
视频教程 : http://v.youku.com/v_show/id_XNDE1NzU0OTY0.html
Equinox OSGi官网 : http://www.eclipse.org/equinox/
林昊 : 《OSGi原理与最佳实践》
Richard S. Hall : 《OSGi实战》