当前位置: 首页 > 知识库问答 >
问题:

无法在Osgi蓝图中动态绑定服务

舒宏富
2023-03-14

我是OSGI蓝图的新手,面临着一个奇怪的问题。

我有两个独立的数据库:oracle和h2(用于测试)db

蓝图容器看起来像这样:

<service ref='oracleDataSource' interface='javax.sql.DataSource'>
    <service-properties>
        <entry key='osgi.jndi.service.name' value='someJndiDatasourceName'/>
    </service-properties>
</service>

<bean id='oracleDataSource'
      class="CustomDataSourceImpl">
    <property name="connectionFactoryClassName" value="${datasource.type}"/>
    <property name="url" value="${url}"/>
    <property name="user" value="${username}"/>
    <property name="password" value="${password}"/>
    <property name="validateConnectionOnBorrow" value="true"/>
</bean>

显然,上面的服务绑定到了oracleDataSource。datasource.type属性从配置文件中填充,其值为Oracle . JDBC . pool . Oracle data source

现在,我的用例是,假设如果我想稍后编辑配置文件并将datasource.type的值更改为h2类型,那么我的service-ref应该绑定到下面提到的bean:

<bean id="h2ds" class="org.h2.jdbcx.JdbcDataSource">
    <property name="URL" value="${url}"/>
    <property name="user" value="${username}"/>
    <property name="password" value="${password}"/>
</bean>

我们可以在蓝图中做这样的动态绑定吗?

基本上,我正在寻找类似于服务定位器的东西。

共有1个答案

羊光辉
2023-03-14

要引入所需的灵活性,正确的位置是

因此,您可以有两个捆绑包来提供 javax.sql.DataSource 服务。一个是用Oracle实现的,另一个是用H2实现的。在集成测试方案中,使用 H2 实现捆绑包并省略 Oracle 实现捆绑包。在生产中,反之亦然。

更新以澄清:

<reference id="dataSourceService"
    interface="javax.sql.DataSource"/>

这将绑定到任何< code>DataSource类型的服务,而不考虑其背后的实现。如果您只部署Oracle捆绑包,那么您的消费者将获得Oracle数据源。如果您只部署H2捆绑包,那么您的消费者将获得H2数据源。消费者不需要改变,这就是OSGi服务的魅力。

 类似资料:
  • 问题内容: 在我的AEM项目的代码中看似无关紧要的更改之后,我的捆绑软件无法解决。检查日志后,我可以看到出现以下错误。 该项目在本地编译得很好,并且只有在容器尝试解决该捆绑包后,该问题才会出现。 我没有在任何更改中添加任何显式依赖项。项目对象模型与以前相同。顾名思义,这是一个核心Java软件包,因此我希望它会被System软件包公开。 我正在运行AEM支持的JDK 7,所以不要指望它与JVM兼容性

  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 静态绑定还是动态绑定? 这显示了什么样的多态性?

  • 起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。

  • 我想指定属性文件的位置,OSGi蓝图属性占位符应从中读取属性值: 更新:Configuration felix.configadmin felix.fileinstall适用于我。 我安装了: org.apache.felix.configadmin-1.8.0.jar org . Apache . Felix . file install-3 . 1 . 4 . jar org.eclipse.

  • 我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。