Spring之DataSource注⼊
对于不同的数据库存取需求,我们使⽤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 = Connection();
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" "/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value&sql.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>
xpath注入和xml注入</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("l"));;
BeanFactory bf = (BeanFactory) reg;
DataBean dataBean = (DataBean) bf.getBean("dataBean");
DriverManagerDataSource并没有提供连接池的功能,只能作作简单的单机连接测试,现在假设连接测试没有问题了,您想要换上DBCP以获得连接池的功能,则原程序不⽤更动,只要改改Bean定义档就可以了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "/dtd/spring-
beans.dtd">
<beans>
<bean id="dataSource" class="org.apachemons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value&sql.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.apachemons.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 = Connection(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" "/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>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。