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的更多相关文章

  1. OSGi 系列(十八)之 基于注解的 Blueprint

    OSGi 系列(十八)之 基于注解的 Blueprint 1. 注解实现 blueprint 第一步:bundle 添加 Bundle-Blueprint-Annotation <plugin& ...

  2. OSGi 系列(十四)之 Event Admin Service

    OSGi 系列(十四)之 Event Admin Service OSGi 的 Event Admin 服务规范提供了开发者基于发布/订阅模型,通过事件机制实现 Bundle 间协作的标准通讯方式. ...

  3. OSGi 系列(十六)之 JDBC Service

    OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...

  4. OSGi 系列(十二)之 Http Service

    OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...

  5. OSGi 系列(十三)之 Configuration Admin Service

    OSGi 系列(十三)之 Configuration Admin Service OSGi 的 CM 就是 Configuration Admin Service,是用于管理 Bundle 属性.并在 ...

  6. OSGi 系列(七)之服务的监听、跟踪、声明等

    OSGi 系列(七)之服务的监听.跟踪.声明等 1. OSGi 服务的事件监听 和 bundle 的事件监听类似,服务的事件监听是在服务注册.注销,属性被修改的时候,OSGi 框架会发出各种不同的事件 ...

  7. OSGi 系列(六)之服务的使用

    OSGi 系列(六)之服务的使用 1. 为什么使用服务 降低服务提供者和服务使用者直接的耦合,这样更容易重用组件 隐藏了服务的实现细节 支持多个服务的实现.这样你可以互换这实现 2. 服务的使用 2. ...

  8. OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统

    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...

  9. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

随机推荐

  1. C# 程序A发送Log记录给程序B,程序B处理和分析Log记录

    C# 程序A发送Log记录给程序B,程序B处理和分析Log记录 关键字:C# ;Log记录 ;在线Log记录;Socket:httplistener 一.常用场景 1. APP开发,在真机或者虚拟机上 ...

  2. selenium+python自动化85-python3.6上SendKeys报错用PyUserInput取代

    前言 python2上安装SendKeys库,对于不好定位的元素,用快捷键操作是极好的,那么在3.6上安装时,会报错 python3.6安装SendKeys报错 1.python3.6安装SendKe ...

  3. Sklearn与特征工程

    Scikit-learn与特征工程 “数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性.大部分直接拿过来的数据都是特征不明显的.没有经过处理的或者说 ...

  4. 微信公众平台开发者认证,node

    纯属分享 app.js var express = require('express'); var path = require('path'); var app = express(); ; var ...

  5. AS3 歌词同步

    这里实例素材: 我们不一样.lrc 我们不一样.mp3 歌词同步其实就是靠lrc文本文件,打开它,可以看到时间点和对应的歌词. 打开lrc内容如下: [ti:我们不一样][ar:大壮][al:][by ...

  6. 使用 C++11 编写类似 QT 的信号槽——下篇

    要实现 Signal-Slot,Signal 类中应该拥有一个保存 std::function 的数组: template<class FuncType> class Signal { p ...

  7. Java 跨域 CrossOrigin注解 Filter拦截 Nginx配置

    说明 资源请求的发起方与请求的资源不在同一个域中的: 一般的,只要网站的[协议名protocol].[主机host].[端口号port]这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用: ...

  8. 低版本eclipse离线集成svn步骤,亲测有效!!!

    1.下载svn离线版的插件: 百度云盘链接:http://pan.baidu.com/s/1eSnMoHO 密码:6oef 2.解压出来的额目录如下: 3.将features和plugins里面的ja ...

  9. autolayout UILabel 设置最大宽度

    label1.preferredMaxLayoutWidth = 100: label1.numberOfLines = 0; //自适应行数

  10. Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

    Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...