对于不同的数据库存取需求,我们使用JDBC来解决这个问题,对于不同的数据连接来源需求,Spring则提供了DataSource注入,更换数据来源只要在Bean定义文件中修改配置,而不用修改任何一行程序。

因应不同的系统,应用程序可能使用不同的数据来源,但如纯綷的使用 JDBC、透过连接池、或是透过JNDI等等,数据来源的更动是底层的行为,不应影响到上层的业务逻辑,为此,您可以在需要取得连接来源的Bean上保留一个数据来源注入的接口,让依赖的数据来源由该接口注入。例如我们来写一个简单的Bean:

DataBean.java

package onlyfun.caterpillar;

import javax.sql.DataSource;

import java.sql.Connection;

public class DataBean {

private DataSource dataSource;

public void setDataSource(DataSource dataSource) {

this.dataSource = dataSource;

}

public void testDataSource() {

try {

Connection connection = dataSource.getConnection();

if(connection != null)

System.out.println("test ok!");

}

catch (Exception e) {

e.printStackTrace();

}

}

}

这是一个简单的测试Spring DataSource注入的程序,我们透过javax.sql.DataSource接口来注入数据来源,Spring提供了 org.springframework.jdbc.datasource.DriverManagerDataSource来取得 DataSource,它实作了javax.sql.DataSource,您将之当作一个Bean,之后再注入DataBean中即可,Bean定义档可以这么撰写:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>com.mysql.jdbc.Driver</value>

</property>

<property name="url">

<value>jdbc:mysql://localhost:3306/TestDB</value>

</property>

<property name="username">

<value>caterpillar</value>

</property>

<property name="password">

<value>123456</value>

</property>

</bean>

<bean id="dataBean" class="onlyfun.caterpillar.DataBean">

<property name="dataSource">

<ref bean="dataSource"/>

</property>

</bean>

</beans>

如果您之前只使用spring-core.jar这个类别库,您还必须加入 spring-dao.jar, org.springframework.jdbc.datasource.DriverManagerDataSource是包括在这个类别库中,如果您使用的是spring.jar,当中已经包括了,无需加入任何的jar,当然,为了使用JDBC,您必须要有JDBC驱动程序的jar档。

可以用下面这段程序简单的测试一下:

BeanDefinitionRegistry reg = new DefaultListableBeanFactory();

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);

reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));;

BeanFactory bf = (BeanFactory) reg;

DataBean dataBean = (DataBean) bf.getBean("dataBean");

dataBean.testDataSource();

DriverManagerDataSource并没有提供连接池的功能,只能作作简单的单机连接测试,现在假设连接测试没有问题了,您想要换上DBCP以获得连接池的功能,则原程序不用更动,只要改改Bean定义档就可以了:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName">

<value>com.mysql.jdbc.Driver</value>

</property>

<property name="url">

<value>jdbc:mysql://localhost:3306/TestDB</value>

</property>

<property name="username">

<value>caterpillar</value>

</property>

<property name="password">

<value>123456</value>

</property>

</bean>

<bean id="dataBean" class="onlyfun.caterpillar.DataBean">

<property name="dataSource">

<ref bean="dataSource"/>

</property>

</bean>

</beans>

现在我们使用的是org.apache.commons.dbcp.BasicDataSource作为注入的 DataSource源,为了使用DBCP的功能,您必须要将commons-dbcp.jar加入CLASSPATH中,另外您还需要commons- pool.jar与commons-collections.jar,这些都可以在Spring的相依版本中的lib目录下找到。

注意到我们在dataSource Bean上宣告了destroy-method,如此可以确保BeanFactory在关闭时也一并关闭BasicDataSource。

如果您要直接使用JDBC来进行数据存储,使用org.springframework.jdbc.datasource.DataSourceUtils来取得Connection会是更好的方式:

Connection conn = DataSourceUtils.getConnection(dataSource);

这样作的好处是,所有的SQLException都被Spring的DataAccessException子类CannotGetJdbcConnectionException包装起来。您可以获得更多的信息,并保证存储层的可移值性。

关闭Connection时,可以用下面的方式:

DataSourceUtils.closeConnectionIfNecessry(connection, dataSource);

如果您的Servlet容器提供了JNDI资料源,您也可以简单的换上这个数据源:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="dataSource" class="org.springframework.indi.JndiObjectFactoryBean">

<property name="jndiName">

<value>jdbc/TestDB</value>

</property>

</bean>

<bean id="dataBean" class="onlyfun.caterpillar.DataBean">

<property name="dataSource">

<ref bean="dataSource"/>

</property>

</bean>

</beans>

为了使用org.springframework.indi.JndiObjectFactoryBean,您必须加入 spring-context.jar这个类别库,jndiName实际上要根据您所设定的JNDI查询名称,您可以在下面这个网址找到有关于 Tomcat中JNDI设定的方式:
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1354

转载于:https://www.cnblogs.com/Super-kk/archive/2012/06/29/2569465.html

Spring之DataSource注入相关推荐

  1. spring(一)依赖注入与 SPEL

    Spring之依赖注入与 SPEL 一.控制反转与依赖注入 二.helloworld 三.构造注入 四.级联注入 五.单例与多例 六.工厂方法创建 Bean 七.包扫描管理 bean 八.SPEL与资 ...

  2. Spring Bean 的注入方式

    DI 注入 一. 传统的注入方式 通过bean标签方式注入 通过包扫描的方式注入 二. 注解方式配置注入 @Configuration 与 @Bean 注解方式注入 @ComponentScan 包扫 ...

  3. Spring学习第4篇:Spring 的依赖注入

    大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...

  4. Spring——Filter过滤器注入Bean时注入失败[NULL]

    问题描述 Spring中Filter注入Bean时注入失败,Bean一直为空. @Slf4j @Component public class RestAuthFilter extends FormAu ...

  5. Spring 多线程下注入bean问题

    问题 Spring中多线程注入userThreadService注不进去,显示userThreadService为null异常 代码如下: public class UserThreadTask im ...

  6. factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入

    第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...

  7. 在ABAP里模拟实现Java Spring的依赖注入

    Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...

  8. Spring Setter依赖注入示例

    学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...

  9. Spring字段依赖注入示例

    学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...

最新文章

  1. C#编程应用--线程与委托
  2. 安卓环境搭建 SDK emulator directory is missing
  3. 你必须掌握的 21 个 Java 核心技术!
  4. Linux基础命令---修改用户信息usermod
  5. 源达投顾软件怎么样_源达投顾:让人工智能炒股终端变得更简单
  6. JavaParser入门:以编程方式分析Java代码
  7. UI设计素材|汉堡按钮/菜单
  8. 文件不混淆_Python代码保护 | pyc 混淆从入门到工具实现
  9. 蓝桥杯 ALGO-120 算法训练 学做菜
  10. css之使用clearfix类清除浮动
  11. Http405错误,方法类型也没有错,解决办法
  12. 计算机死机启动方法,电脑开机死机的解决方法
  13. 计算机资源管理器总是未响应,资源管理器总是无响应,而且开机很慢老是解决不了问题...
  14. Spooling Directory Source 使用
  15. 讯飞AIUI平台语义理解配置全攻略——以Android版AIUI SDK为例
  16. 一键定时关机及取消关机
  17. [原]几条简单命令查询硬件信息
  18. 先验分布,后验分布,共轭分布的关系
  19. list.toArray()方法
  20. c 语言printf输出,位数不够补0

热门文章

  1. linux platform匹配机制,Linux驱动中的platform总线详解
  2. webpack4.0 babel配置遇到的问题
  3. BSD和云 – 不可错过的BSD聚会
  4. LeetCode - 413. Arithmetic Slices - 含中文题意解释 - O(n) - ( C++ ) - 解题报告
  5. JVM-class文件完全解析-方法表集合
  6. Eclipse 创建web项目后没有 Java EE 5 Library,没有web开发相关基础java包,myeclipse中有。...
  7. Android自定义XML属性以及遇到的命名空间的问题
  8. C++ STACK Queue
  9. UA MATH523A 实分析1 集合论基础2 序关系与Zorn引理
  10. 首次使用Windbg调试dNet程序