文档章节

Spring DM

素人派
 素人派
发布于 2016/12/31 20:46
字数 735
阅读 28
收藏 0
  • 介绍
在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

本文转载自:http://surenpi.com/2015/04/08/spring-dm/

上一篇: Linux网络配置
下一篇: 三字经
素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问

暂无文章

springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException

报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a......

冥焱
25分钟前
1
0
威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

迷你芊宝宝
32分钟前
2
0
十大经典排序算法动画与解析

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大,一次不能容纳全部的排序记...

夜黑人模糊灬
35分钟前
5
0
7. java枚举

1. 枚举是什么 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便 2. 为什么不用静态常量来替代枚举类呢? 3. 常用方式 3.1 方式1 枚举类: package cn.ali.tencent...

20190513
36分钟前
1
0
elasticsearch – 弹性搜索:“Term”,“Match Phrase”和“Query String”之间的差异

术语查询匹配单个术语,因为它是:不分析值。 所以,它不必根据你索引的情况而降低。 如果您在索引时间提供Bennett并且未分析该值,则以下查询将不返回任何内容: { "query": { "te...

xiaomin0322
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部