OSGI中blueprint简介
2016-07-04 07:56
351 查看
OSGI中blueprint简介
上篇博文我们开始了felix中的一个example编写,原本计划是讲felix中的几个example全部编写一遍,但是随后发现felix的这几个example都差不多,只是略微有些区别,编写来编写去始终都是这几行代码,讲起来也没什么意思,想着还是开始osgi中新的东西的讲解,思考来去,还是从blueprint开始。blueprint简介
在osgi中服务的使用有多种方式,如使用传统的注册式服务,就是我们之前中example不断使用的使用方式,还是osgi中的声明式服务,还有著名的ipojo等等,但在这里值得花一番笔墨来讲解的应该是blueprint,说到blueprint,务必需要提及一下spring,在个人印象中,spring框架几乎成为了java这么多框架中最为有名的一个,传统上提出的ssh,几乎就只剩下spring一个还非常强力的存活着,而且本身提供的功能也越来越丰富,子项目中springboot也快成为业界微服务一大选择,而在osgi中,spring最初也有所涉及,为spring dm,blueprint产生的规范便是起源于spring dm,随后好像spring dm没有继续发展,但是blueprint却是一直存在目前,Blueprint规范主要有两个实现:Aries blueprint和Gemini blueprint,它们分别来自Apache和Eclipse两个开源组织。我们日后讲的基本都是Apache官网中的blueprint,具体的地址如下:apache blueprint,讲的时候基本不会单独讲解blueprint,会将其他一些东西串起来讲出来,具体到日后讲解其他的时候再说。blueprint使用
blueprint的使用上有些意思,在resource目录下,需要先创建OSGI-INF/blueprint两级目录,然后在里面建立相关的xml文件,在此xml文件的名字不需要固定,也可以为多个,只要在此目录,均会被加载,个人在编写osgi应用时,一般在此目录下会建立两个xml文件,一个为普通的blueprint.xml用于管理我们的服务,另外一个则是暴露对外的接口,为blueprint-cxf.xml,这个在日后一起讲解出来。现在blueprint大致的用法如下所示,其实与spring配置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" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.2.0" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> </blueprint>
其中,在该xml文件中,可以配置bean、service、command等等,在我们前几次编写的felix example中,
其中多次用到DictionService就可以不再使用注册式服务,而使用blueprint进行相关的配置了,如下所示:
<bean id="DictionaryService" class="cn.com.service.DictionaryServiceImpl" />
这是最简单的bean的配置,这种配置方法有多种,在此不讲这么多的使用方式,在另一篇文章中,讲了多种service的使用方法,与此类似,有兴趣可以看一下:blueprint service,在此需要讲一下service和bean的区别,两者看上去几乎一模一样,但是却是用了两种不同的配置方法,原因是bean这种是在bundle内部使用,不暴露对外,但是service是一个bundle提供给另外一个bundle使用,比如A interface在A bundle中,A实现类在B bundle中,c Bundle需要使用A interface提供的服务,就可以使用service来配置服务。
配置服务的使用
在我们进行了以上bean的配置之后是需要进行使用这个服务的,Activator中这种启动Bundle中获取服务的方式不再使用,在此使用注入的服务,如下所示:<bean id="HelloRestService" class="cn.com.service.impl.HelloRestServiceImpl"> <property name="dictionaryService" ref="dictionaryService" /> </bean>
在程序代码中的使用则是:
public class HelloRestServiceImpl { private DictionaryService dictionaryService; }
如此即可正常使用,无需如同spring框架需要加上@Inject注解单独注入。
总结
blueprint在使用上,借用infoq的一篇文章来描述一下,Blueprint是针对OSGi的依赖注入解决方案,用法非常类似Spring。当使用服务的时候,Blueprint会马上创建并注入一个代理(Proxy)。对这些服务进行调用时,如果服务在当前不可用的话,将会产生阻塞,直至能够获取到服务或超时。如果一直阻塞下去,那么当前bundle的启动一直会处于STARTING状态,造成服务一直无法正常启动,需要卸载当前bundle处理当前情况。当然日后如果遇到这种情况,可以具体再进行分析,在此略去不提,本次的blueprint讲解就到这里,具体使用,我们到下一篇博文中再进行讲解。
相关文章推荐
- Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法
- 百度设计负责人在内网道歉了 除了没得到原谅还被除名了
- Sequence算法、思想总结
- UIAlertController_AlertView
- 高性能Key/Value存储引擎levelDB, rocksDB, TiDB,InnoDB
- request的setAttribute()怎么用的?
- StringBuffer和StringBuilder的区别?
- UIScrollView的基本用法
- vue-loader + Webpack 环境搭建
- Android Studio 构建项目卡在 gradle build running
- 【leetcode】303. Range Sum Query - Immutable
- TOJ 3601.Longest Contiguous Subsequence 最长连续公共子序列
- uva 1626 - Brackets sequence dp(区间,坑题, 难度适中,难ac)
- 开发中 十六进制的颜色值直接转为ios可用的UIColor
- Android系统应用---SystemUI之一:SystemUI概述和创建启动流程分析
- 关于UITableView中删除某一行方法的使用
- 修改UITextField的placeholder颜色
- UIStepper
- easyui radio 无法选中的原因
- 使用easyUI遇到的一些小问题