OSGi 系列(十)之 Blueprint

blueprint 是 OSGi 的一个规范,类似于 spring 的 IOC,用来处理 OSGi 的动态特性,可以大大简化服务的使用。

blueprint 是以 xml 文档来构建应用,但它也有采用 Annotation 的方式,我们在此只介绍 xml 的方式。

在 bundle 里,这个 xml 默认的位置在 OSGi-INF/blueprint 下,也可以在 MANIFEST.MF 里指定其它位置上的 xml 文档。

  1. Bundle-Blueprint: OSGI-INF/blueprint/blueprint.xml

1. Blueprint XML

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
  4. <!--1. 默认构造函数-->
  5. <bean id="obj" class="java.lang.Object" init-method="init" destroy-method="destroy">
  6. <property name="name" value="MP4" />
  7. <property name="type" ref="type1" />
  8. </bean>
  9. <!--2. 构造函数-->
  10. <bean id="obj" class="java.lang.Object" init-method="init" destroy-method="destroy">
  11. <argument value="..."/>
  12. <argument value="..."/>
  13. </bean>
  14. <!--3. 工厂方法-->
  15. <bean id="obj2" factory-ref="factory" factory-method="method"/>
  16. </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 类型转换工具的访问
  1. <bean id="" class="" init-method="">
  2. <property name="bundle" ref="blueprintBundle" />
  3. <property name="bundleContext" ref="blueprintBundleContext" />
  4. </bean>

3. blueprint 复杂属性注入

  1. <bean class="com.edu.osgi.blueprint.Order" init-method="init">
  2. <property name="id" value="20160320" />
  3. <property name="products">
  4. <!--1. 集合、数组的注入-->
  5. <list>
  6. <ref component-id="mp4"/>
  7. <ref component-id="dianshi"/>
  8. </list>
  9. </property>
  10. <property name="map">
  11. <!--2. map的注入-->
  12. <map>
  13. <entry key="createDate" value="20160320" />
  14. <entry key="userId" value="101" />
  15. </map>
  16. </property>
  17. </bean>

4. blueprint 注册、使用服务

(1) 新建 3 个 bundle,目录结构如下:

(2) blueprint-api 为接口

  1. package com.github.binarylei.email.api;
  2. public interface EmailService {
  3. void sendEmail(String to, String title, String content);
  4. }

(3) blueprint-service 发布服务

  1. package com.github.binarylei.email.service;
  2. import com.github.binarylei.email.api.EmailService;
  3. public class EmailServiceImpl implements EmailService {
  4. public void sendEmail(String dest, String title, String content) {
  5. System.out.println("OSGi email send. dest=" + dest + ",title=" + title + ",content=" + content);
  6. }
  7. }

在 OSGI-INF/blueprint 新建 blueprint.xml 文件,发布服务:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
  4. <bean id="emailServiceImpl" class="com.github.binarylei.email.service.EmailServiceImpl"/>
  5. <service interface="com.github.binarylei.email.api.EmailService" ref="emailServiceImpl">
  6. <service-properties>
  7. <entry key="vendor" value="163"/>
  8. </service-properties>
  9. </service>
  10. </blueprint>

(3) blueprint-client 处理服务

  1. package com.github.binarylei.email.client;
  2. import com.github.binarylei.email.api.EmailService;
  3. public class EmailClient {
  4. private EmailService emailService;
  5. public EmailService getEmailService() {
  6. return emailService;
  7. }
  8. public void setEmailService(EmailService emailService) {
  9. this.emailService = emailService;
  10. }
  11. public void init() {
  12. emailService.sendEmail("binarylei@qq.com", "blueprint", "成功了");
  13. }
  14. }

在 OSGI-INF/blueprint 新建 blueprint.xml 文件,接收服务:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
  4. <!--服务的引用-->
  5. <reference id="emailService" interface="com.github.binarylei.email.api.EmailService"
  6. filter="(vendor=163)"/>
  7. <bean id="client" class="com.github.binarylei.email.client.EmailClient" init-method="init">
  8. <property name="emailService" ref="emailService"/>
  9. </bean>
  10. </blueprint>

(4) 测试结果如下:

5. blueprint 服务的跟踪

(1) 在 blueprint-client 中编写一个监听类 EmailServiceListener

  1. package com.github.binarylei.email.client;
  2. import com.github.binarylei.email.api.EmailService;
  3. import org.osgi.framework.ServiceReference;
  4. import java.util.Map;
  5. public class EmailServiceListener {
  6. // member-type="service-object"
  7. public void register(EmailService emailService, Map<?, ?> properties) {
  8. System.out.println("======register=====");
  9. System.out.println(properties);
  10. emailService.sendEmail("binarylei@qq.com", "blueprint", "成功了");
  11. }
  12. /*public void register(EmailService emailService) {
  13. }*/
  14. // member-type="service-reference"
  15. /*public void register(ServiceReference reference) {
  16. }*/
  17. public void unregister(EmailService emailService, Map<?, ?> properties) {
  18. System.out.println("======unregister=====");
  19. System.out.println(properties);
  20. emailService.sendEmail("binarylei@qq.com", "blueprint", "成功了");
  21. }
  22. }

(2) blueprint.xml 配制文件

  1. <!--服务的跟踪-->
  2. <reference-list interface="com.github.binarylei.email.api.EmailService" member-type="service-object">
  3. <reference-listener ref="emailServiceListener" bind-method="register" unbind-method="unregister"/>
  4. </reference-list>
  5. <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. uva-10098

    所有的排列,但是要不重复 #include<stdio.h> #include<iostream> #include<sstream> #include<qu ...

  2. 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结

    第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...

  3. Hive启动异常

    [root@host ~]# hivewhich: no hbase in (/root/app/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/b ...

  4. angular controller 之间的通信方式

    AngularJS中的controller是个函数,用来向视图的作用域($scope)添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为. 当我们在创建新的控制器时,angularJ ...

  5. 异常信息ASM ClassReader failed to parse class file的问题解决

    jdk8与spring 3不兼容问题:用jdk7.或者升级到spring4 详情:异常信息ASM ClassReader failed to parse class file的问题解决

  6. XMLTransformProvider

    XMLTransformProvider1 XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument ...

  7. python 2 类与对象

    1.类与对象的概念 类即类别.种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体. 那么问题来了,先有的一个个具体存在的对象(比如一 ...

  8. 遍历Datatable

    //方法一 DataSet dataSet = new DataSet(); DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count; i++) ...

  9. vue基础——Class与Style绑定

    Class与Style绑定 操作元素的class列表和内联样式是数据绑定的一个常见的需求. 因为它们都是属性,所以我们可以用v-bind来处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼 ...

  10. js中函数传参的情况

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...