OSGI Blueprint入门之九

本文探讨了在使用Blueprint注册Servlet并注入OSGi服务时出现的服务始终为null的问题,解释了原因在于创建HTTP请求时的Servlet实例并非Blueprint容器创建的实例。文章进一步提出了解决方案,即通过JNDI查找并引用服务,强调了OSGi服务的动态特性,并讨论了直接通过Blueprint注入OSGi服务的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几日,有网友提了一个问题:用blueprint注册了 一个servlet服务,并将另一个osgi服务注入这个 servlet服务bean里,以便在处理用户的http请求 时调用。但是部署运行后,发现servlet那里注入 的osgi服务一直为null。

表面上,以上的应用似乎设计简单合理。为什么 会出现这样的问题呢? 原因很简单:此servlet非彼 servlet。

当blueprint容器建立起模型时,上例提到的 servlet bean已实例化并注入了所需的osgi服务。 但是,当用户发起http请求时,一个新的servlet 实例在HttpService那里被创建,这个servlet实例 不是blueprint容器创建的那个,而且因为这个 servlet不是由blueprint容器托管的,所以不会被 注入所需的那个osgi服务,自然那个服务引用就 一直为null了。

问题原因找到了,那么怎么样在这个非blueprint 托管的servlet实例里引用osgi服务呢?

blueprint在发布一个osgi服务时,还会将它同时 注册到jndi上,所以,你可以用这个服务的jndi名 来查找到这个服务并引用它。

Blueprint的OSGI服务JNDI名是这样定义的:

<?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";
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 ;http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"
default-timeout="0">

< reference id="CoderService" interface="com.ponder.ICodeService"/>

</blueprint>


那么,blueprint就会注册一个jndi名为 blueprint.comp/CoderService的jndi entry。

在serlvet里就可以这样引用这个服务:


import javax.naming.InitialContext;
import javax.naming.NamingException;
... ...
try {
InitialContext ic = new InitialContext();

com.ponder.ICodeService ref= (com.ponder.ICodeService) ic.lookup("blueprint:comp/CoderService");
if(null!=ref){
... ...
}
} catch (NamingException e) {
... ...
}


由于OSGI的服务是动态的,可能以上代码在运行 时,CoderService服务未必存在,所以,以上代 码需判断服务引用ref是否为null。

以上解决方案可以解决我们的问题,但并不完 美,是否还是可以象最初想的那样,直接通过 blueprint注入osgi服务,而不需要借助JNDI呢? 容我想想看先... ...。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值