【51CTO精选译文】本文是《你好,OSGi》系列的第九部分。之前已经完成了使用Spring DM构建简单应用并导入导出服务套件的过程,下面将介绍Spring DataSource的使用。顾名思义,Spring DataSource用于完成Spring应用程序与数据库直接的联络。
51CTO编辑推荐:OSGi入门与实践全攻略
使用 Spring DataSource
Spring框架的长处之一在于它为处理常见需求提供了一组预制的bean。在***这个小节中,我们将学习Spring DM如何允许用户访问基于OSGi应用程序中的这些预制bean。
在这个练习中,我们将修改 ContactDAO套件,使它连接到一个RDBMS,来与联络表互动。对于连接管理,我们将使用Spring DataSource (org.springframework.jdbc.datasource.DriverManagerDataSource) 类。请注意 Spring 的 DataSource 是 org.springframework.bundle.spring.jdbc 服务套件的一部分。在这个练习中,我使用 Apache Derby 来测试应用程序的代码;你也可以使用你喜欢的数据库。
该练习的***步是在你的数据库中创建联络表。可以使用代码清单 11 中的 DDL 脚本创建这个 CONTACT 表。
代码清单 11. CONTACT 表的 DDL
- CREATE TABLE CONTACT(
- CONTACTID int NOT NULL,
- FIRSTNAME varchar(300),
- LASTNAME varchar(300)
- );
对于连接管理,我们想使用 Spring 的 DriverManagerDataSource bean。问题在于, DriverManagerDataSource 类是 spring.jdbc 套件的一部分,而后者为了完成其工作需访问你的 JDBC 驱动程序类。要解决该依赖性,最简单的方法是将你的 JDBC 驱动程序 JAR 导入到 spring.jdbc 套件中。
***步,右键点击 org.springframework.bundle.spring.jdbc 套件,然后点击 New --> Folder。将该文件夹命名为“JARs folder”。
接着,右键点击新创建的 JARs folder,然后点击 Import --> General --> File System。在 From Directory 下,File System 对话框应显示包含你的 JDBC 驱动程序 JAR 目录的问题。对于我,该位置是 C:\software\db-derby-10.2.2.0-bin\lib。 选择该位置,将在 Select 框中显示 JAR 列表。选择 derbyclient.jar(如果你使用的是 Derby)然后单击完成。Eclipse 将 derbyclient.jar 导入到你的 JARs folder 中。
导入 JDBC 驱动程序 JAR 的***一步是将其添加到你的套件路径中。为此,在 Plug-in Manifest Editor 编辑器中打开 org.springframework.bundle.spring.jdbc 套件的 MANIFEST.MF 文件。然后切换到 Runtimes 标签栏并选择 jars/derbyclient.jar,如图 3 所示。
图 3. 将 derbyclient.jar 添加到套件路径
(如果你喜欢,可以收到更新 bundle-classpath 条目至:Bundle-ClassPath: spring-jdbc-2.5.jar, jars/derbyclient.jar。)
现在,我们已经准备好了,可以通过将 JDBC 代码修改 ContactDAOImpl 类的实现,用来与 CONTACT 表互动。如果你需要,可以从本文的示例代码导入这个 ContactDAOImpl.java;或者只需使用如代码清单 12 中所示的内容。
代码清单 12. RDBMS 访问的 ContactDAO 实现 - ContactDAOImpl.java
- public class ContactDAOImpl implements ContactDAO {
- DataSource dataSource;
- public DataSource getDataSource() {
- return dataSource;
- }
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
- public List getContactList() {
- List contactList = new ArrayList();
- try {
- Connection connection = dataSource.getConnection();
- Statement stmt= connection.createStatement();
- ResultSet rs =stmt.executeQuery("SELECT * FROM CONTACT");
- while(rs.next()){
- int contactId = rs.getInt("CONTACTID");
- String firstName = rs.getString("FIRSTNAME");
- String lastName = rs.getString("LASTNAME");
- Contact contact = new Contact(contactId,firstName,lastName);
- contactList.add(contact);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return contactList;
- }
- //
- }
你会注意到在代码清单 12 中 ContactDAOImpl.java 有几处修改:
首先,我们添加了作为 Java bean 属性的 dataSource,包含相应的 getter 和 setter。Spring 将负责创建 DataSource 对象以及将其导入到 ContactDAOImpl。
getContactList() 方法从数据源(datasource)获取连接,然后使用它来检索 CONTACT 表中的所有联络记录。请注意,代码清单 12 是 ContactDAOImpl.java 的一部分代码;完整的代码请查看示例代码。
ContactDAOImpl 已经准备就绪,我们要做的***一步是修改 ContactDAO 套件中的 contactdao-service.xm,代码如代码清单13 所示:
代码清单 13. 更新 Spring 语境文件 - contactdao-service.xml
- < ?xml version="1.0" encoding="UTF-8"?>
- < beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- < bean name="contactDAOService"
- class="com.javaworld.sample.osgi.spring.contact.impl.ContactDAOImpl">
- < property name="dataSource" >
- < ref bean="dataSource" />
- < /property>
- < /bean>
- < bean name="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- < property name="driverClassName"
- value="org.apache.derby.jdbc.ClientDriver" />
- < property name="url"
- value="jdbc:derby://localhost:1527/C:/derby_home/databases/ClientDB" />
- < property name="username" value="test" />
- < property name="password" value="test" />
- < /bean>
- < /beans>
contactdao-service.xml 的修改如下:
◆我们声明了一个 dataSource bean,指向org.springframework.jdbc.datasource.DriverManagerDataSource。这配置了 Spring,来负责应用程序的数据库连接管理。(请确保在你的 bean 定义中使用你的数据库专用的 JDBC 属性。)
◆接着,我们修改 contactDAOService 的定义来添加对于 dataSource bean 的依赖性。
这样,利用 Spring DM构建的 HelloWorld 服务应用程序已经准备好了。当在 Equinox 容器中执行该应用程序时,它将在应用程序启动时在控制台上输出联络列表。
总结
OSGi 规范为 Spring 应用程序的开发引入了模块化和动态服务。对于已经熟悉 Spring 编程和配置的开发者,Spring DM代表了一种更为简易的入口,可以学习 OSGi 的动态、模块化的开发规范,而无需学习 OSGi API。正如你在本文中所看到的,Spring DM对于 OSGi 中的面向服务应用程序开发是一个非常棒的平台。在一个正在运行的系统中,使用 Spring DM编写的应用程序模块能够动态地进行添加、移除和更新,而且你还可以同时部署指定模块的多个版本。
【编辑推荐】