﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-cAng^Er-文章分类-Spring</title><link>http://www.blogjava.net/xiaosao/category/19242.html</link><description>不懂我的人 , 离不了我 , 该了解了解我 !而懂我的人 , 更离不了我 , 因为他们爱我 。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:30:36 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:30:36 GMT</pubDate><ttl>60</ttl><item><title>DataSource注入</title><link>http://www.blogjava.net/xiaosao/articles/94023.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Mon, 15 Jan 2007 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/articles/94023.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/94023.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/articles/94023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/94023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/94023.html</trackback:ping><description><![CDATA[
		<h3 style="FONT-SIZE: 16px" align="center">
				<a href="http://www.is.pku.edu.cn/blog/?date=2004-12-29&amp;id=2&amp;m=display">http://www.is.pku.edu.cn/blog/?date=2004-12-29&amp;id=2&amp;m=display</a>
		</h3>
		<h3 style="FONT-SIZE: 16px" align="center">DataSource注入</h3>
		<table style="FONT-SIZE: 10px" cellpadding="2" width="70" align="right">
				<tbody>
						<tr>
								<td align="right" width="100%">
										<a title="小白是谁" href="http://www.is.pku.edu.cn/blog/?a=showuser&amp;name=xinyua">
												<img src="http://www.is.pku.edu.cn/blog/images/face/19-1.bmp" />
												<br />xinyua</a>
								</td>
						</tr>
				</tbody>
		</table>
		<div style="FONT-SIZE: 12px">
				<p id="fp">caterpillar 對於不同的資料庫存取需求，我們使用JDBC來解決這個問題，對於不同的資料連接來源需求，Spring則提供了DataSource注入，更換資料來源只要在Bean定義檔中修改配置，而不用修改任何一行程式。 因應不同的系統，應用程式可能使用不同的資料來源，但如純綷的使用JDBC、透過連接池、或是透過JNDI等等，資料來源的更動是底層的行為，不應影響到上層的業務邏輯，為此，您可以在需要取得連接來源的Bean上保留一個資料來源注入的介面，讓依賴的資料來源由該介面注入<br />對於不同的資料庫存取需求，我們使用JDBC來解決這個問題，對於不同的資料連接來源需求，Spring則提供了DataSource注入，更換資料來源只要在Bean定義檔中修改配置，而不用修改任何一行程式。 <br /><br />因應不同的系統，應用程式可能使用不同的資料來源，但如純綷的使用JDBC、透過連接池、或是透過JNDI等等，資料來源的更動是底層的行為，不應影響到上層的業務邏輯，為此，可以在需要取得連接來源的Bean上保留一個資料來源注入的介面，讓依賴的資料來源由該介面注入。例如我們來寫一個簡單的Bean： <br /></p>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代碼:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">package onlyfun.caterpillar; <br />                                                                                <br />import javax.sql.DataSource; <br />import java.sql.Connection; <br />                                                                                <br />public class DataBean { <br />    private DataSource dataSource; <br />                                                                                <br />    public void setDataSource(DataSource dataSource) { <br />        this.dataSource = dataSource; <br />    } <br />                                                                                <br />    public void testDataSource() { <br />        try { <br />            Connection connection = dataSource.getConnection(); <br />            if(connection != null) <br />                System.out.println("test ok!"); <br />        } <br />        catch (Exception e) { <br />            e.printStackTrace(); <br />        } <br />    } <br />}</td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />這是一個簡單的測試Spring DataSource注入的程式，我們透過javax.sql.DataSource介面來注入資料來源，Spring提供了org.springframework.jdbc.datasource.DriverManagerDataSource來取得DataSource，它實作了javax.sql.DataSource，將之當作一個Bean，之後再注入DataBean中即可，Bean定義檔可以這麼撰寫： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代碼:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br />&lt;beans&gt; <br />    &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; <br />        &lt;property name="driverClassName"&gt; <br />            &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt; <br />        &lt;/property&gt; <br />        &lt;property name="url"&gt; <br />            &lt;value&gt;jdbc:mysql://localhost:3306/TestDB&lt;/value&gt; <br />        &lt;/property&gt; <br />        &lt;property name="username"&gt; <br />            &lt;value&gt;caterpillar&lt;/value&gt; <br />        &lt;/property&gt; <br />        &lt;property name="password"&gt; <br />            &lt;value&gt;123456&lt;/value&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />                                                                                <br />    &lt;bean id="dataBean" class="onlyfun.caterpillar.DataBean"&gt; <br />        &lt;property name="dataSource"&gt; <br />            &lt;ref bean="dataSource"/&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />&lt;/beans&gt;</td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />如果之前只使用spring-core.jar這個類別庫，還必須加入spring-dao.jar，org.springframework.jdbc.datasource.DriverManagerDataSource是包括在這個類別庫中，如果使用的是spring.jar，當中已經包括了，無需加入任何的jar，當然，為了使用JDBC，必須要有JDBC驅動程式的jar檔。 <br /><br />可以用下面這段程式簡單的測試一下： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代碼:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">BeanDefinitionRegistry reg = new DefaultListableBeanFactory(); <br />XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg); <br />                                                                                <br />reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));; <br />                                                                                <br />BeanFactory bf = (BeanFactory) reg; <br />DataBean dataBean = (DataBean) bf.getBean("dataBean"); <br />dataBean.testDataSource();</td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />DriverManagerDataSource並沒有提供連接池的功能，只能作作簡單的單機連接測試，現在假設連接測試沒有問題了，想要換上DBCP以獲得連接池的功能，則原程式不用更動，只要改改Bean定義檔就可以了： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代碼:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br />&lt;beans&gt; <br />    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; <br />        &lt;property name="driverClassName"&gt; <br />            &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt; <br />        &lt;/property&gt; <br />        &lt;property name="url"&gt; <br />            &lt;value&gt;jdbc:mysql://localhost:3306/TestDB&lt;/value&gt; <br />        &lt;/property&gt; <br />        &lt;property name="username"&gt; <br />            &lt;value&gt;caterpillar&lt;/value&gt; <br />        &lt;/property&gt; <br />        &lt;property name="password"&gt; <br />            &lt;value&gt;123456&lt;/value&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />    &lt;bean id="dataBean" class="onlyfun.caterpillar.DataBean"&gt; <br />        &lt;property name="dataSource"&gt; <br />            &lt;ref bean="dataSource"/&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />&lt;/beans&gt;</td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />現在我們使用的是org.apache.commons.dbcp.BasicDataSource作為注入的DataSource源，為了使用DBCP的功能，必須要將commons-dbcp.jar加入CLASSPATH中，另外還需要commons-pool.jar與commons-collections.jar，這些都可以在Spring的相依版本中的lib目錄下找到。 <br /><br />注意到我們在dataSource Bean上宣告了destroy-method，如此可以確保BeanFactory在關閉時也一併關閉BasicDataSource。 <br /><br />如果Servlet容器提供了JNDI資料源，也可以簡單的換上這個資料源： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代碼:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br />&lt;beans&gt; <br />    &lt;bean id="dataSource" class="org.springframework.indi.JndiObjectFactoryBean"&gt; <br />        &lt;property name="jndiName"&gt; <br />            &lt;value&gt;jdbc/TestDB&lt;/value&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />    &lt;bean id="dataBean" class="onlyfun.caterpillar.DataBean"&gt; <br />        &lt;property name="dataSource"&gt; <br />            &lt;ref bean="dataSource"/&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />&lt;/beans&gt;</td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />為了使用org.springframework.indi.JndiObjectFactoryBean，必須加入spring-context.jar這個類別庫，jndiName實際上要根據所設定的JNDI查詢名稱</span>
		</div>
<img src ="http://www.blogjava.net/xiaosao/aggbug/94023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-01-15 20:03 <a href="http://www.blogjava.net/xiaosao/articles/94023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>