Spring DM

  • 介绍
在OSGI环境下无法直接使用Spring来做依赖注入,因为每个bundle内部都有一个自己的类加载器。想要使用其他bundle中的服务必须采用OSGI提供的获取服务的接口,这样就导致了Spring无法正确地注入bean对象。 本文介绍的SpringDM就是Spring中用来支持OSGI环境的模块,使用该模块可以做到Spring与OSGI的无缝对接。 这里的DM的意思就是“动态模型”。 SpringDM的核心包有:core、extender、io。 SpringDM中负责注册服务的类是:org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean。 SpringDM的API文档:http://docs.spring.io/osgi/docs/1.2.1/api/
  • 配置文件
SpringDMS需要两个配置文件,路径分别如下: META-INF/spring/bundle-context-osgi.xml META-INF/spring/bundle-context.xml 有关osgi服务的发布和引用的配置(也就是service、reference标签)要放到bundle-context-osgi.xml文件中,spring的bean配置放到bundle-context.xml中
  • 发布服务
<bean id="beanToPublish" class="com.xyz.imp.MessageServiceImp"/> <service ref="beanToPublish" interface="com.xyz.MessageService"/> 在有些情况下,我们可能希望能在发布服务的同时添加一些参数,以便在获取服务的时候可以使用。例如:有多个类实现了同一接口,而在使用服务的时候又要根据具体情况来获取。下面给出一个使用参数的例子: [codesyntax lang="xml"]
<osgi:service ref="paramExampleBean" interface="org.suren.IDataCheckService">
    <osgi:service-properties>
        <entry key="key">
            <map>
	        	<entry key="methods" value="test, test" />
	        	<entry key="methods" value="test, test" />
            </map>
        </entry>
    </osgi:service-properties>
</osgi:service>

<osgi:service ref="exampleBean" interface="org.suren.IDataCheckService">
    <osgi:service-properties>
        <entry key="key" value="TestAction.test">
        </entry>
    </osgi:service-properties>
</osgi:service>
[/codesyntax]
  • 引用服务
<reference id="beanToPublish" interface="com.xyz.MessageService"/> <bean id="referenceBean" class="com.nci.ReferenceBean"> <property name="messageService" ref="beanToPublish"/> </bean> <reference id="dataService" interface="org.suren.IDataCheckService" filter="(key=TestAction.test)"/> 下面的代码是使用OSGI的api来查找service的: [codesyntax lang="java"]
BundleContext context = Activator.LOCAL_BUNDLE.getBundleContext();
    	
        Filter dataFilter = context.createFilter("(objectClass=gboat2.base.core.validate.IDataPrivilegeCheckService)");
        ServiceTracker<IDataService, IDataService> serviceTracker = new ServiceTracker<IDataService, IDataService>(
        		context, dataFilter, null) {

            @Override
            public IDataService addingService(ServiceReference<IDataService> refer) {
                IDataService dataPrivilege =  context.getService(refer);
                
                Object key = refer.getProperty("key");
                System.out.println(key);
                
                return dataPrivilege;
            }

            @Override
            public void remove(ServiceReference<IDataService> refer) {}
        };
        serviceTracker.open();
[/codesyntax]  
  • 监听器
SpringDM可以监听两种事件:导出、引用服务事件。 实现监听器有两种方式:
  1. 实现OsgiServiceRegistrationListener;
  2. 在service标签中定义服务监听配置;
推荐使用第二种方式,因为,它可以使用POJO的类来做监听器。 Spring DM提供了一个registration-listener元素作为service元素的子元素。 可用的属性如下: ref:指定作为监听器的类的唯一标示符 registration-method:指定当有注册事件产生时将要回调的方法。这个方法必须要有两个参数:服务接口类型、Map或者Dictionary类型 unregistration-method:指定当有注销事件产生时将要回调的方法。这个方法的规定和registration-method一样 监听器的实现可以在spring的配置文件中配置为bean,然后使用元素registration-listener注册。
  • 参考
http://www.blogjava.net/chaocai/archive/2008/12/22/247792.html http://docs.spring.io/osgi/docs/1.1.0-m1/api/org/springframework/osgi/web/extender/deployer/tomcat/TomcatWarDeployer.html http://www.blogjava.net/benniaolk/articles/316756.html 介绍如何使用注解http://www.open-open.com/lib/view/open1325412651828.html

你可能感兴趣的:(java,spring,osgi,dm)