赞
踩
目标:弥补java模块化的不足
架构:框架(运行环境)+标准服务(常见任务)
模块层
生命周期层
服务层
创建应用程序方法:
OSGi模块指bundle(含元数据的jar文件)
用META-INF/MANIFEST.MF文件添加元数据信息,声明导入包、导出包
Bundle-Description: One-Ping-Only sample application Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt Bundle-ManifestVersion: 2 Bundle-Name: onos-app-oneping Bundle-SymbolicName: org.onosproject.onos-app-oneping Bundle-Version: 1.10.0.SNAPSHOT Created-By: Apache Maven Bundle Plugin Export-Package: org.onos.oneping;uses:="org.onosproject.core,org.onospro ject.net.flow,org.onosproject.net.flowobjective,org.onosproject.net.pac ket";version="1.10.0" Import-Package: com.google.common.collect;version="[22.0,23)", org.onlab.packet;version="[1.10,2)", org.onosproject.core;version="[1.10,2)", org.onosproject.event;version="[1.10,2)", org.onosproject.net;version="[1.10,2)", org.onosproject.net.flow;version="[1.10,2)", org.onosproject.net.flow.criteria;version="[1.10,2)", org.onosproject.net.flowobjective;version="[1.10,2)", org.onosproject.net.packet;version="[1.10,2)", org.slf4j;version="[1.7,2)" Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))" Service-Component: OSGI-INF/org.onos.oneping.OnePing.xml Tool: Bnd-3.2.0.201605172007
bundle生命周期的操作、bundle如何访问执行环境
想初始化一个驱动程序?
将一个指定的类声明为激活器activator,实现OSGi接口。接口中包含BundleContext类型的参数,作为访问OSGi框架的媒介,可访问OSGi的所有功能。
将Activator信息添加到MANIFEST.MF文件
应用编程模型。服务的发布、查找、绑定交互模式
服务提供者发布服务到服务注册中心,服务客户端搜素中心,查找可供使用的服务
需要做的:
服务:接口+接口实现
服务可见可用:创建一个bundle激活器,start()、stop()方法
start()使用BundleContext将服务注册到服务注册中心,提供服务实现的接口名、实际的服务实例、服务属性
ctx..registerService(InterfaceService.class.getName(), Impl, null)
stop()方法可在bundle停止前注销服务(没必要,会自动注销)
client使用激活器检索间接的服务引用,并使用间接引用去访问服务对象的实例,start()
ServiceReference services = ctx.getServiceReferences(InterfaceService.class.getName());
((InterfaceService) ctx.getService(services)).getInterfaceInfo();
参考1
模块用来处理静态代码和编译时的依赖关系,组件解决实例和执行时的依赖关系。
对于bundle,成为组件需要实现一个bundle激活器。
·bean:用来描述创建Java实例的元素,可以指定实例初始化的类名、构造方法、构造方法的入参及属性。
·service:将bean发布为OSGi Service。
·reference:通过接口名引用一个OSGi Service,可以指定一个特定的属性过滤器。
·reference-list:通过接口名引用多个OSGi Service,可以指定一个特定的属性过滤器。
bean(与spring beans相同的基本语义)
<bean id="DictionaryService" class="cn.com.service.DictionaryServiceImpl" />
bean这种是在bundle内部使用,不暴露对外,但是service是一个bundle提供给另外一个bundle使用
初始化可以使用activation=“eager”或"lazy"设置
service 允许组件提供OSGi服务
service-properties服务属性
entry:定义map条目,key value
Service引用,从OSGi服务注册中心为组件获得一个服务,注册中心已注册服务的代理对象
cardinality参数指定引用的服务是否是可选的,以及需要几个这样的服务。它的值有4种:
0…1 – Optional and unary.
1…1 – Mandatory and unary (Default) .
0…n – Optional and multiple.
1…n – Mandatory and multiple.
————————————————
版权声明:本文为CSDN博主「iteye_7108」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iteye_7108/article/details/82140453
包含多个已注册服务的java.util.List
command
Environment
组件访问OSGi框架和Blueprint容器的权限
src/main/resources目录下,添加OSGI-INF/blueprint两级目录,添加xml文件,命名随意(impl-blueprint.xml),也可以为多个,只要在此目录,均会被加载。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
odl:use-default-for-reference-types="true" >
</blueprint>
<service id="shape" interface="org.foo.shape.SimpleShape" ref="circle">
<service-properties>
<entry key="Simple.shape.name" value="Circle"/>
<entry key="Simple.shape.icon">
<bean class="org.foo.shape.circle.IconFactory"
factory-method="createIcon"/>
</entry>
</service-properties>
</service>
引入工厂bean模式,指定factory-method,允许Blueprint通过构造函数创建对象,可作为服务、参数、服务属性。
服务接口,可以设置为service元素的一个属性interface,也可以使用interfaces元素(可导出多个)或者auto-export属性(属性值可为disabled、interfaces、class-hierarchy、all-classes)。
MANIFEST.MF
加入Bundle-Blueprint: OSGI-INF/blueprint/impl-blueprint.xml
可以是路径、目录、模式*.xml
服务注入客户端
interface A class B class C class D声明依赖关系
B有setService
方法,从服务注册中心注入一个A的实例到组件(set方法,引用注入)
<reference id="a" interface="A"/>
<bean id="b" ckass="B">
<property name="service" ref="a"/>
</bean>
C有构造方法,服务A通过构造函数参数注入(构造函数,构造注入)
<reference id="a" interface="A"/>
<bean id="c" ckass="C">
<argument ref="a"/>
</bean>
D希望聚合多个服务实例,setServices(List<A> list)
,通过一个代理列表注入聚合的OSGi服务
<reference-list id="a" interface="A"/>
<bean id="d" ckass="D">
<property name="services" ref="a"/>
</bean>
监听器reference-listener,当服务在服务注册中心注册或注销时
<bean id="e" ckass="E"/>
<reference id="a" interface="A">
<reference-listener
bind-method="addService"
unbind-method="removeService"
ref="e"/>
</reference>
环境管理器
将bundle上下文环境作为属性注入到WindowListener类
<bean id="listen" class="org.foo.WindowListener">
<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
管理器值
<value>——根据文本字符直接构造对象
<ref>——相同Blueprint中,对顶级管理器的引用
<idref>——另一管理器的id
<map>——java.util.Map
<props>——java.util.Properties
<list>——java.util.List
<set>——java.util.Set
<array>
三、Apache Felix
ONOS1.10源码使用了scr注解,参考apache-felix-maven-scr-plugin/scr-annotations
猜测,不一定对:使用scr注解,在pom.xml文件添加
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
</plugin>
后面再使用maven install/package的时候,会在/target/classes/OSGI-INF/路径下生成xml文件
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.onos.oneping.OnePing" activate="activate" deactivate="deactivate">
<reference name="coreService" interface="org.onosproject.core.CoreService" cardinality="1..1" policy="static" bind="bindCoreService" unbind="unbindCoreService"/>
<reference name="flowObjectiveService" interface="org.onosproject.net.flowobjective.FlowObjectiveService" cardinality="1..1" policy="static" bind="bindFlowObjectiveService" unbind="unbindFlowObjectiveService"/>
<reference name="flowRuleService" interface="org.onosproject.net.flow.FlowRuleService" cardinality="1..1" policy="static" bind="bindFlowRuleService" unbind="unbindFlowRuleService"/>
<reference name="packetService" interface="org.onosproject.net.packet.PacketService" cardinality="1..1" policy="static" bind="bindPacketService" unbind="unbindPacketService"/>
<implementation class="org.onos.oneping.OnePing"/>
</scr:component>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。