OSGi 系列(十)之 Blueprint
OSGi 系列(十)之 Blueprint
blueprint 是 OSGi 的一个规范,类似于 spring 的 IOC,用来处理 OSGi 的动态特性,可以大大简化服务的使用。
blueprint 是以 xml 文档来构建应用,但它也有采用 Annotation 的方式,我们在此只介绍 xml 的方式。
在 bundle 里,这个 xml 默认的位置在 OSGi-INF/blueprint 下,也可以在 MANIFEST.MF 里指定其它位置上的 xml 文档。
Bundle-Blueprint: OSGI-INF/blueprint/blueprint.xml
1. Blueprint XML
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<!--1. 默认构造函数-->
<bean id="obj" class="java.lang.Object" init-method="init" destroy-method="destroy">
<property name="name" value="MP4" />
<property name="type" ref="type1" />
</bean>
<!--2. 构造函数-->
<bean id="obj" class="java.lang.Object" init-method="init" destroy-method="destroy">
<argument value="..."/>
<argument value="..."/>
</bean>
<!--3. 工厂方法-->
<bean id="obj2" factory-ref="factory" factory-method="method"/>
</blueprint>
blueprint 的使用方法与 spring 差不多。
2. blueprint 的环境管理器注入
Blueprint Container 规范还定义了许多特殊的环境管理器,它们设置 ID 并提供对环境组件的访问。它们不具有 XML 定义,并且也不能被重写,因为它们的 ID 被保护起来,不能被其他管理器使用。环境管理器提供的对象只能被注入到使用引用的其他管理器中。Blueprint Container 规范定义了 4 种环境管理器:
blueprintBundle提供包的 Bundle(org.osgi.framework.Bundle) 对象。blueprintBundleContext提供包的 BundleContext(org.osgi.framework.BundleContext) 对象。blueprintContainer为包提供 BlueprintContainer(org.osgi.service.blueprint.container.BlueprintContainer) 对象。blueprintConverter为包提供 Converter(org.osgi.service.blueprint.container.Converter) 对象,提供了对 Blueprint Container 类型转换工具的访问
<bean id="" class="" init-method="">
<property name="bundle" ref="blueprintBundle" />
<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
3. blueprint 复杂属性注入
<bean class="com.edu.osgi.blueprint.Order" init-method="init">
<property name="id" value="20160320" />
<property name="products">
<!--1. 集合、数组的注入-->
<list>
<ref component-id="mp4"/>
<ref component-id="dianshi"/>
</list>
</property>
<property name="map">
<!--2. map的注入-->
<map>
<entry key="createDate" value="20160320" />
<entry key="userId" value="101" />
</map>
</property>
</bean>
4. blueprint 注册、使用服务
(1) 新建 3 个 bundle,目录结构如下:

(2) blueprint-api 为接口
package com.github.binarylei.email.api;
public interface EmailService {
void sendEmail(String to, String title, String content);
}
(3) blueprint-service 发布服务
package com.github.binarylei.email.service;
import com.github.binarylei.email.api.EmailService;
public class EmailServiceImpl implements EmailService {
public void sendEmail(String dest, String title, String content) {
System.out.println("OSGi email send. dest=" + dest + ",title=" + title + ",content=" + content);
}
}
在 OSGI-INF/blueprint 新建 blueprint.xml 文件,发布服务:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<bean id="emailServiceImpl" class="com.github.binarylei.email.service.EmailServiceImpl"/>
<service interface="com.github.binarylei.email.api.EmailService" ref="emailServiceImpl">
<service-properties>
<entry key="vendor" value="163"/>
</service-properties>
</service>
</blueprint>
(3) blueprint-client 处理服务
package com.github.binarylei.email.client;
import com.github.binarylei.email.api.EmailService;
public class EmailClient {
private EmailService emailService;
public EmailService getEmailService() {
return emailService;
}
public void setEmailService(EmailService emailService) {
this.emailService = emailService;
}
public void init() {
emailService.sendEmail("binarylei@qq.com", "blueprint", "成功了");
}
}
在 OSGI-INF/blueprint 新建 blueprint.xml 文件,接收服务:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<!--服务的引用-->
<reference id="emailService" interface="com.github.binarylei.email.api.EmailService"
filter="(vendor=163)"/>
<bean id="client" class="com.github.binarylei.email.client.EmailClient" init-method="init">
<property name="emailService" ref="emailService"/>
</bean>
</blueprint>
(4) 测试结果如下:

5. blueprint 服务的跟踪
(1) 在 blueprint-client 中编写一个监听类 EmailServiceListener
package com.github.binarylei.email.client;
import com.github.binarylei.email.api.EmailService;
import org.osgi.framework.ServiceReference;
import java.util.Map;
public class EmailServiceListener {
// member-type="service-object"
public void register(EmailService emailService, Map<?, ?> properties) {
System.out.println("======register=====");
System.out.println(properties);
emailService.sendEmail("binarylei@qq.com", "blueprint", "成功了");
}
/*public void register(EmailService emailService) {
}*/
// member-type="service-reference"
/*public void register(ServiceReference reference) {
}*/
public void unregister(EmailService emailService, Map<?, ?> properties) {
System.out.println("======unregister=====");
System.out.println(properties);
emailService.sendEmail("binarylei@qq.com", "blueprint", "成功了");
}
}
(2) blueprint.xml 配制文件
<!--服务的跟踪-->
<reference-list interface="com.github.binarylei.email.api.EmailService" member-type="service-object">
<reference-listener ref="emailServiceListener" bind-method="register" unbind-method="unregister"/>
</reference-list>
<bean id="emailServiceListener" class="com.github.binarylei.email.client.EmailServiceListener"/>
(3) 测试结果如下:

OSGi 系列(十)之 Blueprint的更多相关文章
- OSGi 系列(十八)之 基于注解的 Blueprint
OSGi 系列(十八)之 基于注解的 Blueprint 1. 注解实现 blueprint 第一步:bundle 添加 Bundle-Blueprint-Annotation <plugin& ...
- OSGi 系列(十四)之 Event Admin Service
OSGi 系列(十四)之 Event Admin Service OSGi 的 Event Admin 服务规范提供了开发者基于发布/订阅模型,通过事件机制实现 Bundle 间协作的标准通讯方式. ...
- OSGi 系列(十六)之 JDBC Service
OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...
- OSGi 系列(十二)之 Http Service
OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...
- OSGi 系列(十三)之 Configuration Admin Service
OSGi 系列(十三)之 Configuration Admin Service OSGi 的 CM 就是 Configuration Admin Service,是用于管理 Bundle 属性.并在 ...
- OSGi 系列(七)之服务的监听、跟踪、声明等
OSGi 系列(七)之服务的监听.跟踪.声明等 1. OSGi 服务的事件监听 和 bundle 的事件监听类似,服务的事件监听是在服务注册.注销,属性被修改的时候,OSGi 框架会发出各种不同的事件 ...
- OSGi 系列(六)之服务的使用
OSGi 系列(六)之服务的使用 1. 为什么使用服务 降低服务提供者和服务使用者直接的耦合,这样更容易重用组件 隐藏了服务的实现细节 支持多个服务的实现.这样你可以互换这实现 2. 服务的使用 2. ...
- OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统
OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
随机推荐
- C# 程序A发送Log记录给程序B,程序B处理和分析Log记录
C# 程序A发送Log记录给程序B,程序B处理和分析Log记录 关键字:C# ;Log记录 ;在线Log记录;Socket:httplistener 一.常用场景 1. APP开发,在真机或者虚拟机上 ...
- selenium+python自动化85-python3.6上SendKeys报错用PyUserInput取代
前言 python2上安装SendKeys库,对于不好定位的元素,用快捷键操作是极好的,那么在3.6上安装时,会报错 python3.6安装SendKeys报错 1.python3.6安装SendKe ...
- Sklearn与特征工程
Scikit-learn与特征工程 “数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性.大部分直接拿过来的数据都是特征不明显的.没有经过处理的或者说 ...
- 微信公众平台开发者认证,node
纯属分享 app.js var express = require('express'); var path = require('path'); var app = express(); ; var ...
- AS3 歌词同步
这里实例素材: 我们不一样.lrc 我们不一样.mp3 歌词同步其实就是靠lrc文本文件,打开它,可以看到时间点和对应的歌词. 打开lrc内容如下: [ti:我们不一样][ar:大壮][al:][by ...
- 使用 C++11 编写类似 QT 的信号槽——下篇
要实现 Signal-Slot,Signal 类中应该拥有一个保存 std::function 的数组: template<class FuncType> class Signal { p ...
- Java 跨域 CrossOrigin注解 Filter拦截 Nginx配置
说明 资源请求的发起方与请求的资源不在同一个域中的: 一般的,只要网站的[协议名protocol].[主机host].[端口号port]这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用: ...
- 低版本eclipse离线集成svn步骤,亲测有效!!!
1.下载svn离线版的插件: 百度云盘链接:http://pan.baidu.com/s/1eSnMoHO 密码:6oef 2.解压出来的额目录如下: 3.将features和plugins里面的ja ...
- autolayout UILabel 设置最大宽度
label1.preferredMaxLayoutWidth = 100: label1.numberOfLines = 0; //自适应行数
- Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)
Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...