spring DM demo

参考:

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

理想结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值