2012JAVA認證:Spring的學習原理是注入

火星人 @ 2014-03-09 , reply:0
←手機掃碼閱讀

首先我們來看看 Spring 參考文檔的 11.2.6. 執行SQL語句 這裡有個代碼片段:

import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;public class ExecuteAStatement public void setDataSource }

這個就是通俗的 Java 類, 再參考 11.2.4. DataSource介面, 這裡的另一個代碼片段:

DriverManagerDataSource dataSource = new DriverManagerDataSource;dataSource.setDriverClassName;dataSource.setUrl;dataSource.setUsername;dataSource.setPassword;

當然膳縵沔的毗連體例可以設置裝備擺設成我們課程琅縵沔介紹的 MyEclipse Derby 的資料庫毗連:

org.apache.derby.jdbc.ClientDriverjdbc:derby://localhost:1527/myeclipse;create=trueappapp

我們可以寫一個測試類來執行代碼:

import org.springframework.jdbc.datasource.DriverManagerDataSource;public class TestTemplate }

這個代碼可以跑通, 就是通俗的編程體例, 巨匠可以去看適才介紹的文檔四周的具體聲名.

那麼假如用 Spring 來做, 代碼會釀成這樣:

ExecuteAStatement 類代碼連結不變, 多了個 beans.xml:

ExecuteAStatement 類代碼連結不變, 多了個 beans.xml:

?xml version=「1.0」 encoding=「UTF-8」?

beans

xmlns=「http://www.springframework.org/schema/beans」

xmlns:xsi=「http://www.w3.org/2001/XMLSchema-instance」

xsi:schemaLocation=「http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd」

bean id=「userDAO」

property name=「dataSource」

ref bean=「myDataSource」 /

/property

/bean

bean id=「myDataSource」

property name=「driverClassName」

valueorg.hsqldb.jdbcDriver/value

/property

property name=「url」

valuejdbc:hsqldb:hsql://localhost:/value

/property

property name=「username」

valuesa/value

/property

property name=「password」

value/value

/property

/bean

/beans

測試類:

import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test }

和膳縵沔的 TestTemplate 類對比, 就會發現 new DriverManagerDataSource() 這個過程不用我們寫了, 運行的時辰會發現一切都執行的好好的, 也就是常說的 ExecuteAStatement 的 dataSource 這個屬性被注入了.

那麼這個過程到底該若何理解呢? Spring 是一個對象池, 可以簡化為一個 Map, 存多個主鍵和對象的映射. 那麼 Spring 運行的過程中, 會按照 beans.xml 一步步進行需要的解析工作:

Map springEngine = new HashMap();

OK, 解析到了

bean id=「userDAO」 , 發現 bean 界說, 那就新建一個實例存到對象池裡吧, 主鍵就是 userDAO, 值就是對象:

ExecuteAStatement bean1 = new ExecuteAStatement();

springEngine.put(「userDAO」, bean1);

再往下執行, 發現 property 界說:

property name=「dataSource」

到了這裡, 就知道應該挪用 bean1.setDataSource(DataSource) 體例了. 可以接著執行, 發現

ref bean=「myDataSource」 /, 哦, 這個體例的參數還沒有呢, 是個 bean 的引用, 好了, 要挪用這個體例, 仍是先 new 一個名字為 myDataSource 的 bean2 吧. 就跳到下面尋找 myDataSource 的界說, 找到了:

bean id=「myDataSource」property name=「driverClassName」valueorg.hsqldb.jdbcDriver/value/propertyproperty name=「url」valuejdbc:hsqldb:hsql://localhost:/value/propertyproperty name=「username」valuesa/value/propertyproperty name=「password」value/value/property /bean

像以前一樣, 先實例化這個類, 然後看到 property 神色就挪用對應的 setXxx() 這樣的體例, 相當於下面一段代碼:

// 新建一個數據源對象DriverManagerDataSource bean2 = new DriverManagerDataSource;bean2.setDriverClassName;bean2.setUrl;bean2.setUsername;bean2.setPassword;

不是還有個 bean 的 id 名字為 myDataSource 嘛, 那就把它存到對象池琅縵沔:

springEngine.put(「myDataSource」, bean2);

好了, 就是把他們兩個聯繫關係起來了, 經由過程 ref 里指定的 bean id 名來聯繫關係起來:

// 省略類型轉換的代碼

springEngine.get(「userDAO」).setDataSource(springEngine.get(「myDataSource」));

返回給用戶的就是一個對象池(一個 Map)了, 別人挪用的時辰, 就發現 springEngine.get(「userDAO」) 回來的類的 dataSource 屬性已經被實例化過了, 這些都是 Spring 幕後工作的代碼, 經由過程反射機制來實現.

寫代碼挪用:

context.getBean(「userDAO」) 的時辰, 獲得的是 ExecuteAStatement, 這時辰還有一個 myDataSource, 也可以被挪用:

context.getBean(「myDataSource」), 獲得的是 DriverManagerDataSource.





[火星人 via ] 2012JAVA認證:Spring的學習原理是注入已經有260次圍觀

http://www.coctec.com/docs/java/show-post-59856.html