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. 64位win10系统无法安装.Net framework3.5的两种解决方法

    参考网站: https://blog.csdn.net/zang141588761/article/details/52177290 在Windows10中,当我们安装某些软件的时候会提示“你的电脑上 ...

  2. DistCp 集群之间数据拷贝工具

    DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具.可以将数据拷贝到另个一集群,也可以将另一个集群的数据拷贝到本集群.

  3. leetcode459

    public class Solution { public bool RepeatedSubstringPattern(string s) { var len = s.Length; ) { ret ...

  4. 1.mysql ERROR 1045 (28000): 错误解决办法

    转自:https://www.cnblogs.com/jpwz/p/6061214.html ERROR 1045 (28000): Access denied for user 'ODBC'@'lo ...

  5. Activity服务类-3 FormService服务类

    1.获取//通过流程定义ID获取表单字段集合StartFormData startFormData = formService.getStartFormData(processDefinitionId ...

  6. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)

    图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下 ...

  7. 转。。原理同样支持 delphi

    我用C#导出excel 带图片,用office2003 正常,但换成office 2007 时,我指定多个单元格分别插入图片,这个图片不在此单元格内,这些图片全都集中在一起,在一个位置上.很奇怪,看起 ...

  8. 使用FIO测试磁盘iops

    我们如何衡量一个存储的性能呢?IOPS(Input/Output OperationsPer Second),即每秒进行读写(I/O)操作的次数是国际上通用的存储性能衡量标准,IOPS越高意味着在同一 ...

  9. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...

  10. 使用HTTP头去绕过WAF(bypasswaf)

    在用node http get 请求的时候,发现的 解决方案: Add headers to all Burp requests to bypass some WAF products. This e ...