spring datasource 注入
来源:互联网 发布:java分时图和k线图 编辑:程序博客网 时间:2024/06/06 17:27
因应不同的系统,应用程序可能使用不同的数据来源,但如纯綷的使用 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://blog.csdn.net/sjzs5590/article/details/7325915
- spring datasource 注入
- Spring之DataSource注入 .
- Spring入门11 - DataSource注入
- spring的datasource的注入
- Spring中JdbcDaoSupport的DataSource注入问题
- 对于Spring注入静态DataSource的一些问题
- Spring DataSource
- spring DataSource
- Spring DataSource
- 注释方式注入datasource
- 《Spring 2.0技术手册》 读书笔记七-Spring的DAO框架(1)-原理与DataSource注入
- 《Spring 2.0技术手册》 读书笔记七-Spring的DAO框架(1)-原理与DataSource注入
- spring+mybatis 注入properties文件中属性失败导致datasource加载失败的原因和解决
- jdbc dao 注入 dataSource 失败
- spring中的dataSource
- spring'datasource 配置
- Spring的dataSource配置
- spring中获取datasource
- 在VC中CSpinButtonCtrl用法,整理下来
- 如何使用memcache减轻数据库压力
- 求Fibonacc数列中大于t(t>3)的最小一个数 例 带入1000输出1597
- PointerManager --渲染
- Android输入法挤乱布局问题
- spring datasource 注入
- Android嵌套布局时覆盖问题的解决
- 计算机操作系统进程切换详解
- DBCA创建ASM数据库时遇到ORA-01031
- Java NIO Channel
- To Do List
- Dalvik和标准Java虚拟机
- Visual C++ MFC 简明教程
- *脚本技巧小节*