javascript
Spring之DataSource注入
因應(yīng)不同的系統(tǒng),應(yīng)用程序可能使用不同的數(shù)據(jù)來(lái)源,但如純綷的使用 JDBC、透過(guò)連接池、或是透過(guò)JNDI等等,數(shù)據(jù)來(lái)源的更動(dòng)是底層的行為,不應(yīng)影響到上層的業(yè)務(wù)邏輯,為此,您可以在需要取得連接來(lái)源的Bean上保留一個(gè)數(shù)據(jù)來(lái)源注入的接口,讓依賴的數(shù)據(jù)來(lái)源由該接口注入。例如我們來(lái)寫(xiě)一個(gè)簡(jiǎn)單的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();
??????? }
??? }
}
這是一個(gè)簡(jiǎn)單的測(cè)試Spring DataSource注入的程序,我們透過(guò)javax.sql.DataSource接口來(lái)注入數(shù)據(jù)來(lái)源,Spring提供了 org.springframework.jdbc.datasource.DriverManagerDataSource來(lái)取得 DataSource,它實(shí)作了javax.sql.DataSource,您將之當(dāng)作一個(gè)Bean,之后再注入DataBean中即可,Bean定義檔可以這么撰寫(xiě):
<?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這個(gè)類(lèi)別庫(kù),您還必須加入 spring-dao.jar, org.springframework.jdbc.datasource.DriverManagerDataSource是包括在這個(gè)類(lèi)別庫(kù)中,如果您使用的是spring.jar,當(dāng)中已經(jīng)包括了,無(wú)需加入任何的jar,當(dāng)然,為了使用JDBC,您必須要有JDBC驅(qū)動(dòng)程序的jar檔。
可以用下面這段程序簡(jiǎn)單的測(cè)試一下:
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并沒(méi)有提供連接池的功能,只能作作簡(jiǎn)單的單機(jī)連接測(cè)試,現(xiàn)在假設(shè)連接測(cè)試沒(méi)有問(wèn)題了,您想要換上DBCP以獲得連接池的功能,則原程序不用更動(dòng),只要改改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>
現(xiàn)在我們使用的是org.apache.commons.dbcp.BasicDataSource作為注入的 DataSource源,為了使用DBCP的功能,您必須要將commons-dbcp.jar加入CLASSPATH中,另外您還需要commons- pool.jar與commons-collections.jar,這些都可以在Spring的相依版本中的lib目錄下找到。
注意到我們?cè)赿ataSource Bean上宣告了destroy-method,如此可以確保BeanFactory在關(guān)閉時(shí)也一并關(guān)閉BasicDataSource。
如果您要直接使用JDBC來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ),使用org.springframework.jdbc.datasource.DataSourceUtils來(lái)取得Connection會(huì)是更好的方式:
Connection conn = DataSourceUtils.getConnection(dataSource);
這樣作的好處是,所有的SQLException都被Spring的DataAccessException子類(lèi)CannotGetJdbcConnectionException包裝起來(lái)。您可以獲得更多的信息,并保證存儲(chǔ)層的可移值性。
關(guān)閉Connection時(shí),可以用下面的方式:
DataSourceUtils.closeConnectionIfNecessry(connection, dataSource);
如果您的Servlet容器提供了JNDI資料源,您也可以簡(jiǎn)單的換上這個(gè)數(shù)據(jù)源:
<?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這個(gè)類(lèi)別庫(kù),jndiName實(shí)際上要根據(jù)您所設(shè)定的JNDI查詢名稱,您可以在下面這個(gè)網(wǎng)址找到有關(guān)于 Tomcat中JNDI設(shè)定的方式:
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1354
轉(zhuǎn)載于:https://www.cnblogs.com/Super-kk/archive/2012/06/29/2569465.html
總結(jié)
以上是生活随笔為你收集整理的Spring之DataSource注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Symfony2 学习笔记之模板使用
- 下一篇: JS浮点数运算Bug的解决办法(转自百度