spring DM demo

来源:互联网 发布:思途旅游cms 编辑:程序博客网 时间:2024/06/03 11:47

参考:

eclipse中进行示例:http://www.cnblogs.com/HeroBeast/archive/2012/03/13/2393698.html

spring标签使用:http://blog.csdn.net/shuyaji/article/details/1393272

四种osgi框架介绍:http://www.cnblogs.com/longkerdandy/archive/2010/09/29/OSGi_Compare.html


一 命令行环境搭建:


1、下载osgi的equinox实现:

org.eclipse.osgi-3.5.1.R35x_v20090827.jar

这里面有,或者maven仓库里面应该搜得到,到处都有的下

http://s3.amazonaws.com/dist.springframework.org/milestone/OSGI/spring-osgi-2.0.0.M1-with-dependencies.zip

2、测试osgi环境:

java -jar org.eclipse.osgi-3.5.1.R35x_v20090827.jar

可以用基本的osgi命令行查看已经启动的bundle:ss

3、下载springDM需要的包:

http://s3.amazonaws.com/dist.springframework.org/milestone/OSGI/spring-osgi-2.0.0.M1-with-dependencies.zip

从中间选出下面这些包,和org.eclipse.osgi一起,放到一个文件夹,比如 /spring-osgi-min :


4、步骤2运行过以后,会产生一个configuration/config.ini文件,加入如下内容:

osgi.bundles=

com.springsource.org.aopalliance@start,com.springsource.org.apache.log4j@start,com.springsource.slf4j.api@start,com.springsource.slf4j.log4j@start,com.springsource.slf4j.org.apache.commons.logging@start,org.springframework.aop@start,org.springframework.asm@start,org.springframework.beans@start,org.springframework.context@start,org.springframework.context.support@start,org.springframework.core@start,org.springframework.expression@start,spring-osgi-core@start,spring-osgi-extender@start,spring-osgi-io@start

5、测试spring-osgi环境:

java -jar org.eclipse.osgi-3.5.1.R35x_v20090827.jar

如果看到 log4j:WARN 这样的输出,没关系,不影响示例。可以用ss查看除了一个log4j的包RESOLVED之外,其他都ACTIVE了。


二 测试spring特性


按你的习惯,编写一套spring osgi的测试包,我的如下:

test.api-0.0.1.jar

test.provider-0.0.1.jar

test.consumer-0.0.1.jar

1、在eclipse中新建maven工程,取名api,并如下配置pom.xml文件:

<groupId>test.springDM</groupId><artifactId>test.api</artifactId><version>0.0.1</version><packaging>bundle</packaging>
上面打包的方式要写bundle,不然maven-bundle-plugin插件会不生效(了解不多,测验得知)
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><version>2.4.0</version><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>api</Bundle-SymbolicName><Export-Package>test.springDM.api</Export-Package><Bundle-Vendor>My Name</Bundle-Vendor></instructions></configuration></plugin></plugins></build>

写一个接口类:

package test.springDM.api;public interface PersonManager {public void savePerson(String username, String password);}

2、新建maven工程provider,如下配置pom.xml

<groupId>test.springDM</groupId><artifactId>test.provider</artifactId><version>0.0.1</version><packaging>bundle</packaging><dependencies><dependency><groupId>test.springDM</groupId><artifactId>test.api</artifactId><version>0.0.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><version>2.4.0</version><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>provider</Bundle-SymbolicName><Export-Package></Export-Package><Bundle-Vendor>My Name</Bundle-Vendor><Include-Resource>/META-INF = /META-INF</Include-Resource></instructions></configuration></plugin></plugins></build>

并在工程下新建 /META-INF/spring/services.xml文件:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"xsi:schemaLocation="    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"><bean id="personManager" class="test.springDM.provider.PersonManagerImpl" /><osgi:service id="personManagerService" ref="personManager"interface="test.springDM.api.PersonManager" /></beans>

编辑Java代码:

package test.springDM.provider;import test.springDM.api.PersonManager;public class PersonManagerImpl implements PersonManager {public PersonManagerImpl() {System.out.println("instance PersonManagerImpl");}public void savePerson(String username, String password) {System.out.println("save person: " + username + ", " + password);}}

3、新建maven工程consumer,类似配置pom文件,services.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"xsi:schemaLocation="    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"><osgi:reference id="personManagerOSGI" interface="test.springDM.api.PersonManager"><osgi:listener ref="serviceChecker" bind-method="bind"unbind-method="unbind"></osgi:listener></osgi:reference><bean id="activator" class="test.springDM.consumer.Activator"init-method="start" destroy-method="stop"></bean><bean id="serviceChecker" class="test.springDM.consumer.ServiceChecker"factory-method="getInstance"></bean></beans>

Java类:

package test.springDM.consumer;import org.osgi.framework.FrameworkUtil;/** * 如果一个Bean对象需要访问BundleContext,则可以让该Bean对象实现BundleContextAware接口 */public class Activator {//private static Logger logger = Logger.getLogger(Activator.class);public void start() throws Exception {System.out.println("start "+ FrameworkUtil.getBundle(Activator.class).getSymbolicName());Thread t = new Thread(new Runnable() {public void run() {while (ServiceChecker.getInstance().getPersonManager() == null) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}ServiceChecker.getInstance().getPersonManager().savePerson("sb", "sb");//logger.debug("hehe");}});t.start();}public void stop() throws Exception {System.out.println("stop Activator");}}

package test.springDM.consumer;import java.util.Map;import test.springDM.api.PersonManager;public class ServiceChecker {private static ServiceChecker INSTANCE = new ServiceChecker();private PersonManager personManager;private ServiceChecker() {}public static ServiceChecker getInstance() {return INSTANCE;}public void bind(Object service, Map properties) {if (service instanceof PersonManager) {this.setPersonManager((PersonManager) service);System.out.println("service personManager bind!");}}public void unbind(Object service, Map properties) {if (service instanceof PersonManager) {this.setPersonManager(null);System.out.println("service personManager unbind!");}}public PersonManager getPersonManager() {return personManager;}public void setPersonManager(PersonManager personManager) {this.personManager = personManager;}}

4、打包编译好以后,一样放到 spring-osgi-min 文件夹下,并在 config.ini文件里面,添加这三个包:

test.api@start,test.consumer@start,test.provider@start

一样启动osgi:

java -jar org.eclipse.osgi-3.5.1.R35x_v20090827.jar

理想结果:


0 0
原创粉丝点击