OSGI中blueprint简介

Posted 叶长风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OSGI中blueprint简介相关的知识,希望对你有一定的参考价值。

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讲解就到这里,具体使用,我们到下一篇博文中再进行讲解。

以上是关于OSGI中blueprint简介的主要内容,如果未能解决你的问题,请参考以下文章

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

Eclipse OSGi 包需要另一个包的片段

如何在 Scala 的 Felix 中运行 OSGi 蓝图?

osgi + felix example1编写

在基于Apache Camel蓝图的OSGi包中检测到重复的ServletName

为什么Aries Blueprint没有为camel-cxf和camel-blueprint注册名称空间处理程序?