Spring之DataSource注入
因应不同的系统,应用程序可能使用不同的数据来源,但如纯綷的使用 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注入相关推荐
- spring(一)依赖注入与 SPEL
Spring之依赖注入与 SPEL 一.控制反转与依赖注入 二.helloworld 三.构造注入 四.级联注入 五.单例与多例 六.工厂方法创建 Bean 七.包扫描管理 bean 八.SPEL与资 ...
- Spring Bean 的注入方式
DI 注入 一. 传统的注入方式 通过bean标签方式注入 通过包扫描的方式注入 二. 注解方式配置注入 @Configuration 与 @Bean 注解方式注入 @ComponentScan 包扫 ...
- Spring学习第4篇:Spring 的依赖注入
大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...
- Spring——Filter过滤器注入Bean时注入失败[NULL]
问题描述 Spring中Filter注入Bean时注入失败,Bean一直为空. @Slf4j @Component public class RestAuthFilter extends FormAu ...
- Spring 多线程下注入bean问题
问题 Spring中多线程注入userThreadService注不进去,显示userThreadService为null异常 代码如下: public class UserThreadTask im ...
- factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入
第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...
- 在ABAP里模拟实现Java Spring的依赖注入
Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...
- Spring Setter依赖注入示例
学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...
- Spring字段依赖注入示例
学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...
最新文章
- C#编程应用--线程与委托
- 安卓环境搭建 SDK emulator directory is missing
- 你必须掌握的 21 个 Java 核心技术!
- Linux基础命令---修改用户信息usermod
- 源达投顾软件怎么样_源达投顾:让人工智能炒股终端变得更简单
- JavaParser入门:以编程方式分析Java代码
- UI设计素材|汉堡按钮/菜单
- 文件不混淆_Python代码保护 | pyc 混淆从入门到工具实现
- 蓝桥杯 ALGO-120 算法训练 学做菜
- css之使用clearfix类清除浮动
- Http405错误,方法类型也没有错,解决办法
- 计算机死机启动方法,电脑开机死机的解决方法
- 计算机资源管理器总是未响应,资源管理器总是无响应,而且开机很慢老是解决不了问题...
- Spooling Directory Source 使用
- 讯飞AIUI平台语义理解配置全攻略——以Android版AIUI SDK为例
- 一键定时关机及取消关机
- [原]几条简单命令查询硬件信息
- 先验分布,后验分布,共轭分布的关系
- list.toArray()方法
- c 语言printf输出,位数不够补0
热门文章
- linux platform匹配机制,Linux驱动中的platform总线详解
- webpack4.0 babel配置遇到的问题
- BSD和云 – 不可错过的BSD聚会
- LeetCode - 413. Arithmetic Slices - 含中文题意解释 - O(n) - ( C++ ) - 解题报告
- JVM-class文件完全解析-方法表集合
- Eclipse 创建web项目后没有 Java EE 5 Library,没有web开发相关基础java包,myeclipse中有。...
- Android自定义XML属性以及遇到的命名空间的问题
- C++ STACK Queue
- UA MATH523A 实分析1 集合论基础2 序关系与Zorn引理
- 首次使用Windbg调试dNet程序