编程语言
首页 > 编程语言> > Java-OSGi声明式服务和Spring

Java-OSGi声明式服务和Spring

作者:互联网

我有一个数据访问模块,该模块提供使用Spring和JDBC的存储库的实现.

因此,我将Spring上下文定义如下:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

    <bean id="annotationTransactionAspect" factory-method="aspectOf" class="org.springframework.transaction.aspectj.AnnotationTransactionAspect">
        <property name="transactionManager" ref="transactionManager" />
    </bean>
</beans>

我还将使用声明式服务将存储库实现公开为服务,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<component name="cdr-repository" enabled="true" xmlns="http://www.osgi.org/xmlns/scr/v1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.osgi.org/xmlns/scr/v1.1.0 http://www.osgi.org/xmlns/scr/v1.1.0">

    <!-- Property and Properties -->
    <properties entry="OSGI-INF/myrepository-component.properties" />

    <!-- Service (optional) -->
    <service>
        <provide interface="com.example.osgi.dataaccess.api.MyRepository" />
    </service>

    <!-- Zero or more references to services -->

    <!-- Exactly one implementation -->
    <implementation class="com.example.osgi.dataaccess.jdbc.impl.MyRepositoryImpl" />
</component>

因此,我的服务是在Spring环境之外创建的,因此未完全配置(例如,未注入数据源).

我正在寻找将Spring与声明式服务集成的正确方法.

谢谢,Mickael

解决方法:

Spring和Declarative服务不能一起使用.因此,您使用的方法将不起作用.声明式服务是一个非常简单的框架,只能将服务连接到组件中并将组件作为服务发布.它没有有关jpa的功能.因此,我想如果您想使用具有容器管理的持久性的jpa之类的东西,DS将不是一个很好的选择.

就像Holly提到的,蓝图在其他一些aries模块的帮助下也提供了支持.我创建了一个教程,在完整的示例中显示了如何使用它.查看:http://liquid-reality.de/pages/viewinfo.action?pageId=6586413

蓝图方法与spring如何进行jpa和容器管理的事务非常不同.在春季,您通常会在上下文中创建数据源并将其注入.在蓝图中,您的工作更像在标准jpa中.在那里,在persistence.xml中引用了数据源,并使用jndi进行了查询.然后,Aries jndi从jndi桥接到OSGi服务,因此另一个捆绑包可以将数据源作为OSGi服务提供.

您还有另一个选择是使用spring dm以“ spring way”创建jpa服务.但是无法维护spring dm,在OSGi中存在很多问题.因此,蓝图是当前的最佳选择.

标签:osgi,declarative-services,spring,java
来源: https://codeday.me/bug/20191122/2056101.html