`
zqc_0101
  • 浏览: 229119 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Declarative Services中的服务引用

    博客分类:
  • OSGI
阅读更多

当某个Component依赖某一服务的时候,这个服务很有可能会被在任何时候注销,框架对这种情况只是做了简化处理,开发人员必须关心这个事情,做出相应的处理。

 

target services:写入到reference元素中的服务。这个时候Component configuration并没有真正引用这个服务。

bound service:被绑定到Component configuration的target services。

 

1、Accessing Services

Component实例取得bound service有两种方式:

(1)Event strategy

当你在reference元素中指定policy属性为dynamic时,也应该同时在reference元素中指定bind和unbind属性,这两个属性指定绑定和取消绑定的方法。

 

(2)Lookup strategy

Component实例可以通过ComponentContext的locateService方法获取bound service。

 

在实际使用中,两个方法可以用其一,也可以都使用。

如果使用Event strategy,bind和unbind指定的方法应该具有下面的形式:

1 void <method-name>(ServiceReference);
2 void <method-name>(<parameter-type>);
3 void <method-name>(<parameter-type>, Map);

 

如果bind和unbind方法具有第一种形式,ServiceReference参数将被传递给locateService(String,ServiceReference)方法,以获取bound service。如果需要在访问bound service之前检查service properties,这个方法是很有用的。Event strategy允许bound service的延迟激活。

 

如果是第二种形式,则bound service的实例对象直接被传递给方法。

 

如果是第三种形式,则bound service的实例对象直接被传递给方法作为第一个参数,第二个参数Map包含了bound service的properties,并且这个Map是不能修改的。

 

对于每一个bound service,bind和unbind方法必须要被调用一次。这意味着如果Reference元素中的基数属性指定是N多个的,那么这两个方法可能会被调用很多次。

 

例如,一个Component需要调用Log Service,并且使用Lookup strategy,那么Reference元素就无须指定bind和unbind方法。

<?xml version="1.0" encoding="UTF-8"?>
<scr:component name="example.listen"
xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
<implementation class="com.acme.LogLookupImpl"/>
<reference name="LOG"
interface="org.osgi.service.log.LogService"/>
</scr:component>

 

Component的实现类必须去搜索服务,如下:

public class LogLookupImpl {
private void activate(ComponentContext ctxt) {
LogService log = (LogService)
ctxt.locateService("LOG");
log.log(LogService.LOG_INFO, "Hello Components!"));
}
}

 

 

另一种方法是使用Event strategy,如下:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component name="example.listen"
xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
<implementation class="com.acme.LogEventImpl"/>
<reference name="LOG"
interface="org.osgi.service.log.LogService"
bind="setLog"
unbind="unsetLog"
/>
</scr:component>

Component的实现类,如下:

public class LogEventImpl {
private LogService log;
private void setLog( LogService l ) { log = l; }
private void unsetLog( LogService l ) { log = null; }
private void activate() {
log.log(LogService.LOG_INFO, "Hello Components!"));
}
}

 

 

2、Reference Cardinality

一个Component通常要指定引用服务的基数范围,这个基数有两方面的意思:

(1)Multiplicity(多重,多个)

例如,一个Component只需要使用到一个Log Service就可以了。但是,当the Configuration Admin使用Configuration Listener services时,它必须绑定所有在服务注册表里的此类服务,只有这样,它才可以正确分发事件。

 

(2)Optionality(可选择的)

如果bound service不存在,Component也可以正常工作吗?对于有些来说,这是可以的,但有些就不行,比如,有个程序存在一个Servlet,但是如果Http Service如果不存在,显然它是无法正常工作的。

 

cardinality可以被指定成下面四种:

• 0..1 – Optional and unary.(0个或1个)
• 1..1 – Mandatory and unary (Default) (强制必须有一个)
• 0..n – Optional and multiple.(0个或多个)
• 1..n – Mandatory and multiple.(1个或多个)

 

对于2和4两种情况,当激活Component Configuration时,必须至少存在一个可以引用的bound service。

如果cardinality只指定最多1个,但是存在多个target service情况,那么Component Configuration将去绑定某个service.ranking值最大的target service,如果service.ranking也一样,那么就去比较service.id(启动号),谁最低,就绑定谁(谁先启动先绑定谁)。

 

 

 

3、Reference Policy

如果Component的所有references都已具备,Component Configuration可以被激活并绑定这些服务。但是,OSGI的动态性可能会使得某个被绑定的target service已经又被修改、注册或者取消注册了,因此,Component应该指定一个策略来处理这些变化。

 

static策略是最简单的策略也是默认的策略。如果有一个target service可以去替换一个失效的target service,那么Component Configuration应该要被重新激活并绑定到替代的target service。如果Component引用的服务频繁地取笑注册和重新注册,或者激活和取笑激活一个Component Configuration花销很大,static策略的的开销将是很大的。如果cardinality指定的是多个services,static策略是不适用的。

 

dynamic策略就有点复杂了,因为Component必须正确处理变化。SCR可以修改bound services的设置而无须注销Component Configuration,如果Component使用event strategy访问服务,那么通过bind和unbind方法,Component实例将会被通知到bound service的变化。

 

像前面注册资源的例子,使用的是static策略,这表明如果Http Services的设置有所改变,那么Component Configuration必须要被注销。

 

选择Target Services

 

Circular References

最好不要去循环引用,即ComponentA和ComponentB不要互相引用。

分享到:
评论
1 楼 李嘉铭 2015-03-16  
你知道 Component可以当注解使用吗?像这样@Component(service=HTTPService.class,name="respon")?

相关推荐

    declarative

    Declarative Services(DS),在OSGi环境中,是一种声明式的方式来管理服务和组件的机制。它的核心思想是通过XML配置文件来定义服务的提供者和消费者,而不是通过代码直接引用和依赖其他服务,从而实现更加灵活和...

    《osgi与equinox 创建高度模块化的java系统》第6章DS代码

    本章聚焦于OSGi中的Declarative Services(DS),这是一种声明式的服务管理机制,它简化了服务的生命周期管理。 Declarative Services(DS)是OSGi服务模型的一部分,它允许开发者在配置文件中声明服务的依赖关系和...

    OSGI服务 DS EVENT

    DS(Declarative Services)是OSGI中的一个核心服务,它提供了声明式的方式来管理和装配服务。而EVENT则是DS中关于事件处理的部分,用于在OSGI组件之间传递信息和协调工作。 OSGI服务是一种动态的服务注册和发现...

    OSGI的消息机制及注册服务

    在OSGI框架中,bundle之间的通信主要通过服务事件和服务引用来实现。服务事件允许bundle监听其他bundle提供的服务的变化,例如服务的注册、修改或注销。这些事件可以被感兴趣的bundle订阅,以便在服务状态改变时采取...

    OSGi service

    此外,声明式服务(Declarative Services)、iPOJO和Spring OSGi等框架提供了更高级的声明式模型,简化了服务的管理和生命周期管理。 白板模式(Whiteboard Pattern)是解决服务监听问题的一个有效方法。在这种模式下,...

    解决osgi spring 事务配置问题

    2. **Declarative Services (DS)**:在OSGi中,推荐使用Declarative Services来声明和管理服务,而不是直接在代码中硬编码依赖。DS允许在运行时动态发现和注入服务,包括事务管理服务。 3. **Transaction Manager**...

    OSGi传说beta1.1.pdf

    - **使用Declarative Services (DS)管理服务** - **OSGi的事件机制** - **使用DS处理事件** - **OSGi与Spring框架的整合** - **OSGi与Hibernate框架的整合** - **服务的属性和过滤器** #### 三、注册和导出服务 ##...

    OSGi实现用户登录验证

    2. OSGi Declarative Services (DS) 实现: DS是OSGi规范中的一个重要部分,它简化了服务的生命周期管理和依赖注入。在DS中,服务的声明和依赖关系都在XML配置文件(通常是MANIFEST.MF或_metatype/目录下的*.xml...

    Intellij 13下OSGi的Maven例子

    客户端和服务端的实现通常会涉及到OSGi的Declarative Services(DS)或Blueprint,它们是声明式服务配置的方式,通过XML文件定义服务的依赖和行为。在DS中,我们可以使用`@Component`和`@Reference`注解来声明服务...

    osgi-tutorial.zip

    通过Blueprint,我们可以声明服务引用,当服务可用时,它会被自动注入到我们的bean中。 6. **测试和调试**: 在OSGi环境中,测试和调试可能需要特殊工具,如Equinox的pde-test插件或Felix的Scr工具。确保正确配置了...

    osgi-in-action源码.rar

    10. **Declarative Services (DS)**:OSGi DS是用于声明式管理服务的规范,简化了服务的注册和引用,使得代码更简洁,降低了复杂性。 通过对《OSGi in Action》源码的深入研究,我们可以学习到如何设计和实现符合...

    eclipse下构建spring与OSGI项目

    同时,可以使用Spring的Declarative Services(DS)来管理OSGi服务。 4. 编写代码:按照OSGi的模块化原则编写代码,每个模块(bundle)应尽可能独立。同时,利用Spring的特性,如DI和AOP,实现业务逻辑。 5. 测试...

    OSGI入门和整合Spring

    3. **使用Declarative Services(DS)**:OSGI DS提供了一种声明式的方式来管理OSGI服务的生命周期,使得Spring的bean可以与OSGI服务无缝集成。 4. **动态依赖注入**:由于OSGI的动态性,服务可以在运行时添加或...

    OSGI原理与最佳实践(附简下载)

    6. **合理利用服务组件模型(Declarative Services, DS)**: 使用DS声明式配置服务,减少代码量,提高代码可读性和可维护性。 7. **监控与日志**: 集成OSGI的监控和日志服务,便于调试和排查问题。 8. **安全性...

    深入理解OSGi

    - **组件模型**:Equinox支持基于Declarative Services (DS) 和 Blueprint的组件模型,简化了服务组件的定义和管理。 - **事件系统**:Equinox的事件系统使得bundle之间可以订阅和发布事件,实现异步通信。 - **...

    FLex连接数据

    Declarative Services定义** - `&lt;employeeservice:EmployeeService&gt;`定义了一个数据服务实例`employeeService`。 - `fault`属性定义了当发生错误时的处理逻辑。 **5. UI元素与DataGrid配置** - 定义了几个UI...

    Osgi in Action: Creating Modular Applications in Java Jun 2010

    第十章“Component Models”介绍了OSGi中使用的组件模型,如Declarative Services (DS) 和 Blueprint Container。这些组件模型为开发者提供了灵活的方式来声明服务和组件的依赖关系,简化了模块化应用程序的设计和...

    osgi-projects

    7. **声明式服务(Declarative Services, DS)**: 是OSGi中一种声明式的方式来配置和管理服务。开发者可以在XML文件中声明组件和服务的依赖,DS会自动处理服务的生命周期和依赖关系。 8. **Java**: OSGi 是基于...

Global site tag (gtag.js) - Google Analytics