More Related Content More from Justin Lin (20) Spring 2.0 技術手冊第一章 - 認識 Spring1. 作 語 術 些 這 對 針 將,中 節 章 個 這 在,措 所 知 不 往 往 語 術 等 、 A OP IoC
、 器 容、性 入 侵 非、級 量 輕 對 面,說 來 者 學 初 的 門入算打於對
Spring
。案方
的合整相們它與了供提也 ,)等
S pring 、 、 (
H ibernate J SF S truts
架框種各的存現於對,外之此除,) (
A pplication framework
架框式程用應的位方全個一是,裝封型模的致一供提) Interface
( 務 服 業 企 的 用 常 些 一 於 對 並,現 實 的 架 框
API A pplication MVC Web
供提,援支的) (易交、)
T ransaction (層久持對供提
P ersistence
,式方現實的) ( 供提並,架框
A spect-oriented programming AOP
的) (性 入 侵 非 、 器 容)
N o intrusive ( 現實
I nversion of Control IoC
它,) (器 容 的)
C ontainer (級 量 輕 個 是 心 核 的
L ightweight Spring
認識 Spring
1
2. 1 2
。礎基的時現
實念概語術些這對 Spring 紹介,中節章個各後往為作以,紹介些一
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
3. 1 3
。用使接
直中之架框或式程用應個一另到拿接直以可,件組些某中式程用應,話的
Spring
用使,說的單簡。) R eusability
(性用重可的件組式程用應加增步
一進,擔負的時植移架框從式程用應低減,在存的架框到不受感乎幾式程
用 應 讓 望 希,架 框) N o intrusive
(性 入 侵 非 個 一 現 實 是 一 之 標 目 的 Spring
。中之式程用應個一另於用重接直以可件組的中當說別更,來出立獨中
架框從法無而,賴依生發架框與件組式程用應使會都,等別類些某的 API
API
承繼接直或, 的架框了用使量大如例,賴依了生發架框與就式程用應
,用 使 被 旦 一 架 框 些 有 而 然,式 程 用 應 的 需 所 下 構 架 循 依 出 發 開 的 速 快,上
礎基的架框於基以可員人發開讓,現實的構架個一供提是意用的來原架框
) (性入侵非 N o intrusive
。 Spring
用使中備設型小在以可至甚您,的小很是也擔負源資
的要需所心核 Spring
用使而,小大的 到不有只上量容案檔在心核的 1MB
S pring EJB
,的說來)器容 如(器容的級量重些一於對相是容形的級量輕
) (級量輕 L ightweight
。 識認的 本 基 個 有 念 概 與 語術些 這 對 您 讓 以 可 明 說
的下以,言而者學初的 Spring
門入於對,語術等) oriented programming
( 、)
A spect- A OP ( 、)
I nversion of Control (性入侵非
I oC N o intrusive
、 器 容、級 量 輕 是 像 到 觸 接 得 就 時 用使在,) Spring(架框式程 F ramework
用應的面方全個一為作,多越來越也語術與念概的上作實與計設在域領個各
而 因,雜 複越 來越 用應 的 域領個 各於 式程 用應 , 日今 在於 由 , ) framework
A pplication
(架框式程用應的位方全個一為作是,一之標目的 Spring
1.1 術語介紹
Spring 識認 Chapter 1
4. 1 4
,上 Spring AOP
至 映 反 注 關 的 於 對 們 人,述 描 的 當 適 件 一 是 不 並 架 框 AOP
是架框 Spring說,架 框 子 個 一 的 援 支 Spring
是 只 架 框 而 然,現 實 的 AOP
)A spect-oriented programming AOP
( 援支是一之能功的視重人為最 Spring
) A spect-oriented programming
( AOP
。念概的
Dependency Injection與 Inversion of Control
紹介細詳會還,中節一下在
。件物的定指
入注賴依將,態組據根動自會器容心核 S pring
,定設以加中檔態組在需只
, 係 關 賴 依 的 件 物 護 維 中 碼 式 程 在 己 自 必 不, Spring
用 使。 稱 簡,」 入 注 DI
賴依「作翻常文中, Dependency Injection
為念概心核要重個一另 Spring
。難困的離脫器容
從式程用應成造,能功的器容於賴依式程用應免避以可,說來度角的器容
從,合耦的間之件物免避以可,說來度角的件物從,念觀的要重是」作實
非而象抽於賴依「、」移 轉的係關賴依「,中 Spring
在。 稱簡,」轉 IoC
反制控「作翻常文中, Inversion of Control
是念概心核的要重最 Spring
Dependency Injection
與 Inversion of Control
。好作您幫動自會都器容在現,係關件物理管以式程寫撰行
自須必先原,式程的寫撰所 個一是就器容,說來體具度角的 從 Java Java
。係關賴依的間之件物與件物立建是或,件物生產
來碼式程行一何任寫撰用不,用取接直以可都件物的有所,後之器容動啟
在,等 性 屬 的 件 物 個 某 為 成 定 設 須 必 後 之 生 產 件 物 個 哪、) 式 方 Singleton
或式方 P rototype
(生產何如、稱名件物義定中當在,) 是常通(案 XML
檔定設態組個一用使以可您,能功器容供提 S pring
。係關賴依的間之件物
與件物成完至甚,期週命生等毀銷、得取源資、成生的件物理管以可器容
) (器容 C ontainer
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
5. 1
。式程用應的行進所前當於用適而,合整 與以可都 Spring
,等 、 J SF Struts
是 像,合 整 Spring
與架框 的悉熟所己自將以可也您 Web
。術技面畫的者用使給
PDF
現展為作 用使、 合結、 用使如例,術技層 的同不用使Tiles JSP View
AOP IoC
換 抽 的 鬆 輕 以 可 至 甚 您,能 功 的 與 身 本 其 用 善 以 可 是 處 好 的 架 框
Spring Web 用使,案方決解的架框) ( W eb MVC
供提也 Model 2 Spring
架框 Web
。案方決解的應對了供提也 ,化簡的 S pring
上 用 使 及 合 整 的) 、 i BATIS
(具 工 H ibernate O/R Mapping
於 對, 能 功 理 管
) Declarative Transaction
(易交式告宣與) P rogrammatic Transaction
(易交式
程 編 供提 ,化 簡 與裝 封以 加用 使的 JDBC
對如 ,合 整 的 層久 持對供提 Spring
層久持
。案方合整架框的 供提望 one-stop shop
希 S pring
,代替以加案方架框的它其合結以可也,立獨以可此彼能功 API
的裝封或架框子些這的 S pring
,能功 與器容 的 AOP 於重依些 IoC Spring
API
有 現 實 的 們 它,裝 封 的 務 服 業 企 種 各 及 以 架 框 、層 久 持 了 現 M VC Web
實中 Spring
在,在所心重其是現實的能功 與能功器容 的 AOP IoC Spring
。除移能功誌日個這將
,下況情的式程何任改修不在以可也,意願您若而,中式程用應的先原至
入 加 求 需 個 這 將 就,碼 式 程 行 一 何 任 改 修 須 無 以 可 您,求 需 的) ( L ogging
誌日個有式程用應設假,用應個一的 明說來子例的際實個舉 AOP
。色特的注關人令個一另的 了顯突也 Spring
但,解誤所有然雖,上架框 的它在中集注關的 AOP 於對們人得使 Spring
Spring 識認 Chapter 1
6. 1 6
。會體中作實從節章
的後往在以可您,現實的體具有都念概些這中 在,解了 Spring
能太不是還能可語術些這上以對面,驗經的發開人前收吸來習
學的 Spring
由藉望希是只,驗經的架框它其過用使有沒您果如
。化簡為更上用使在且並,型模用使的致一有以可時用使在務服些
這讓,裝封行進務服些這對式方層象抽取採是而,作實供提接直不 Spring
Remoting
,等) (程遠、) Scheduling
(程排、 、 如例,務服些一於對 Mail JNDI
裝封的務服業企它其
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
7. 1 7
。 係 關 賴依了 生 產 組 模 層 低 對 就
,式函的組模層低行執叫呼接直組模層高果如,求需式程的份備檔存個是
組模層高而,計設取存機碟軟的關相體硬與是能可組模層低如例。組模作
實 的層 低 於賴 依 不 而 ,性 用重 有 具該 應 它 ,組 模 的 關 相) B usiness logic
(
輯邏務商與是常通組模象抽的層高,時計設組模行進在,說的單簡
。性用重可的
式程用應進改而進,轉反係關賴依的良不種這將何如要又而,計設係關賴
依 的良不 些 哪 有 去 過 看 看 ,轉反 的 係 關 賴 依 是 就 也, 解 瞭 始 開 Inversion
Dependency IoC
從先可, 解瞭要,義意其解瞭易容不上面字從, 看初 IoC
。 」轉反 制 控 「 是 就 , 話 的來過 譯 翻 要 硬 文 中 果 如 , Inversion of Control
I oC
名全 ?思意麼什是 底到,後之炸轟字文的象抽串連一 IoC
IoC
。 現 表 種 一 的 是也」 式 程 用 應 於 務 服 器容是 而 , 器 容 於 賴 依 應
IoC
不 式程用 應 「 , 現 表 種 一 的 是 也 」 現 實 賴 依 象抽是 不 而 , 象 抽 賴 依 須
IoC
必現 實 「 , 現 表 種 一 的 是 」 象 抽 於 賴 依 須 必 都組模 是 而 , 組 模 層 低 賴
依該應不組模層高「是像,的說來計設式程用應的良不去過於對相是移轉
。」移 轉 的係 關 賴依「是念概象抽的 , 是念概心核的 I oC IoC Spring
1.2 控制反轉(Inversion of Control)
Spring 識認 Chapter 1
8. 1 8
}
}
writer.saveToFloppy();
...
public void save() {
....
private FloppyWriter writer = new FloppyWriter();
public class Business {
Java
: 例 為 式 程 以 。 」面介 象 抽 於 賴 依 是 而 ,作實 賴 依 應 不 式 程 「 為
釋解) D ependency Inversion
(轉反賴依,計設來式方的向導件物以若
。計設式程
用應的層高用使複重以可才樣這,象抽的組模於賴依都組模望希上計設在
。式方計設的好個一是不這,動更著跟須必也組模層高了成造,動更的體
媒存儲的組模層低於由,中子例個這在。行才改修以加須必,用重接直法
無式程用應個這則,體媒存儲為作碟磁 用使台平該而,上台平個一另 USB
API
至 植移式 程 用 應 將 要 天 今 設 假 。 的 組 模 層 低 於賴依 式 程 用 應 層 高 致 導
,saveToFloppy()
了行執接直時求需存儲要需在式程用應,中 圖在 1.1
作實組模層低賴依組模層高 1.1 圖
…
賴依生產組模層低對
API
式程用應致導, 的組模層低
叫呼中 式程用應的層高在接直
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
9. Chapter 1 識認 Spring
的際實於賴依求需的檔存,中計設的別類
Business FloppyWriter 物
改 修 須 必 則 , 碟 磁 為 改 介 媒 存儲將 要 想 天 今 果 如 , 件
USB Business 程的
。別類 用使複 重 接 直 法 無 您 , 式
Business
個一告宣先可如例,況情一此進改以可,告宣的面介過透果如
IDeviceWriter :面介
public interface IDeviceWriter {
public void saveToDevice();
}
於 賴 依 為 計 設 以 可,時 求 需 檔 存 到 遇 在,別 類
Business 的計設所著接
:如例,
IDeviceWriter 的際實於賴依是不而,面介 FloppyWriter
public class Business {
private IDeviceWriter writer;
public void setDeviceWriter(IDeviceWriter writer) {
this.writer = writer;
}
public void save() {
....
writer.saveToDevice();
}
}
至存儲有天今果如,的用重以可是就別類
B usiness ,下計設的樣這在
Floppy 作 實 別 分 求 需 存 儲種兩 這 對 針 要 只 , 求 需 的 碟 磁 或
USB IDevice-
:別類
Writer 個 一計設 存 儲 的 機 碟 軟 對 針如 例 , 可 即 面 介
FloppyWriter
public class FloppyWriter implement IDeviceWriter {
public void saveToDevice() {
....
//至存儲際實
至存儲際實
至存儲際實
至存儲際實 Floppy 碼式程的
碼式程的
碼式程的
碼式程的
}
}
1
10. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
對針是或 USB 個一計設存儲的碟磁 UsbDiskWriter :別類
public class UsbDiskWriter implement IDeviceWriter {
public void saveToDevice() {
....
// 至存儲際實
至存儲際實
至存儲際實
至存儲際實 UsbDisk 碼式程的
碼式程的
碼式程的
碼式程的
}
}
: 下 如 式 程 態 組 個 一寫撰 以 可 , 話 的 存 儲 機碟軟 要 需 式 程 用 應 果 如
Business business = new Business();
business.setDeviceWriter(new FloppyWriter());
business.save();
要需式程用應果如,的樣同 USB 程態組個一寫撰以可,話的存儲碟磁
:下如式
Business business = new Business();
business.setDeviceWriter(new UsbDiskWriter());
business.save();
都說來別類 於 對 ,動 變 何 如 作 實 存 儲 的 層 低 論 無 , 到 看 以 可
Business
的單簡個一由藉,式程理管態組個一寫撰以可也您。改修何任需無 XML
就 ,寫撰 必 不 都 式 程 態 組 的上以 連 此 如 , 態 組 改 更 來 案 檔
.properties 是或
簡個寫如例,作實 Business的賴依所別類 換更的單簡以可
IDeviceWriter
BusinessFactory : 的單
package onlyfun.caterpillar;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class BusinessFactory {
private static BusinessFactory factory;
private Properties props;
1 1
11. Chapter 1 識認 Spring
private Business business;
private IDeviceWriter writer;
private BusinessFactory() throws Exception {
props = new Properties();
props.load(new FileInputStream("config.properties"));
String businessClass = props.getProperty("business.class");
String writerClass = props.getProperty("writer.class");
business = (Business) Class.forName(
businessClass).newInstance();
writer = (IDeviceWriter) Class.forName(
writerClass).newInstance();
business.setDeviceWriter(writer); // 係關賴依立建
}
public static BusinessFactory getInstance() throws Exception {
if (factory == null) {
factory = new BusinessFactory();
}
return factory;
}
public Business getBusiness() {
return business;
}
public IDeviceWriter getWriter() {
return writer;
}
}
的單簡個這 BusinessFactory 從將 config.properties 取讀中案檔
與
business.class writer.class 成完動自並,定設 Buniness 對 IDeviceWriter
設假。賴依的作實 :定設麼這
config.properties
business.class=onlyfun.caterpillar.Business
writer.class=onlyfun.caterpillar.FloppyWriter
1 11
12. 1 12
。面介 IDeviceWriter
於賴依也 、 U sbDiskWriter Writer
F loppy-
且,面介 I DeviceWriter
於賴依 讓而,上面介 B usiness IDeviceWriter
的象抽至移轉 FloppyWriter
的際實從權制控個整,中式程 的面 Business
上在。性用重可的件元得獲以可,權制控有擁方象抽讓由藉,方一的象抽
至移轉方一的作實由權制控將,轉反的係關制控是即轉反的係關賴依以所
B
, 係關種 這 移 轉 要 想 您 , 權 制 控 有 擁 是 即 義 意 其 , 於 賴 依 果 如 。 移 B A
轉的係關賴依種一是也義意的後背實其,思意的制控是 的 Control IoC
。」象抽 於 賴依 要 都作 實 與 式程 是 而, 作 實於
賴 依 不 式程「是即思意的 D ependency Inversion
,看來紹介的上以從
。案專 BusinessFactoryDemo
的中碟光考參以可,範示式程的整完 BusinessFactory
。係關賴依的 Business
定設來,能功器容 的 IoC Spring
2
用 使 何 如 到 看 以 可 將 章 第在, 大 強 為 更 能 功 且 而,能 功 理 管 態 組 的 樣 這
供提就器容心核 S pring
, 上實事 , 外 之 件 元 要 主 的式程 用 應 至 離 隔 立 建 的
係關賴依、立建的件物將以可,作實 BusinessFactory
的單簡個一過透
。作實 saveToDevice()
的例實 UsbDiskWriter
是將的用使所上際實,時法方 行執 save()
,段片式程的 Business
上以則, onlyfun.caterpillar.UsbDiskWriter
成換 中 writer.class properties
config.果如,作實 saveToDevice()
的例實 是將的用使 FloppyWriter
所上際實,時法方 save()
行執 ,定設的 B usiness 據根 config.properties
business.save();
business = BusinessFactory.getInstance().getBusiness();
:法方 其行執 save()
並,例實 Business 得取 BusinessFactory 過 透下如 以 可 , 中 式 程 在 則
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
13. 1 13
。改修的何任作用不
而架框或器容的它其至移轉,離脫中統系器容從時隨以可,用使器容被正
API
到 識意會 不 身 本 式 程 用 應 , 定特 的 器 容 於 賴 依會不 而 故 , 源 資 求 要 動
主器容向不式程用應,中式程用應至入注源資的需所將面介象抽些這過透
API
以 可器容 , 面 介 的 象 抽 於 賴依以 可 身 本 式 程 用 應 。 的依 相 器 容 與 現 出
應不是就也,式程用應入侵)要不量儘或(該應不器容是的求要 IoC
。」!您 給 件物 些 這將 動 自 會器 容 ,源 資 )件 物 ( 的要 需 所求 要 器容
向要不「是就,話的說來語術的式程以,」 D on't call me, I'll call you.
「
:表代來言名塢萊好句一麼這用以可,度角的器容在 。難困生發會就 I oC
,時器容或架框的它其至移轉則,器容賴依於過輯邏務商果如,器容或架框
的它其至輯邏務商的式程用應個整移轉能可有才來將樣這,響影的器容或
架框用使所到受應不,的用重以可為計設要該應份部輯邏務商的式程
Spring 識認 Chapter 1
14. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
1.3 依賴注入(Dependency Injection)
的
IoC 在,念概式模的層高個一是上本基式模 Martin Fowler Inversion
(
of Control Containers and the Dependency Injection pattern h ttp://www.
:式方種兩有 現實,到談中)
martinfowler.com/articles/injection.html IoC
是的用採所
Dependency Injection , 與
Service Locator Spring D ependency
Injection 。入 注賴依為譯翻文中, 現實來
IoC
於賴依) (件組讓,面介象抽留保「:是義意的入注賴依 C omponent
來面介象抽過藉,時係關賴依生發件物的際實它其與要件組當,面介象抽
」。件 物 際 實 的 賴 依 入 注
:式方現實本基種三了到談中章文的 在入注賴依
Martin Fowler
稱 別 分 並。
Interface injection 與 、
S etter injection Constructor injection
。
Type 1 IoC 與 、
T ype 2 IoC 為其
Type 3 IoC
Type 2 IoC 、
T ype 3 IoC
是的現實所 的到提所中節小個一前在 Business Type 2 IoC也 ( 過透,Setter
而,件物的賴依所入注)法方
setXXX 是就 Type 3 IoC 式構建在是則,
:如例,係關賴依入注上)
C onstructor (
public class BusinessObject {
private IDeviceWriter writer;
public BusinessObject(IDeviceWriter writer) {
this.writer = writer;
}
public void save() {
....
writer.saveToDevice();
}
}
1 14
15. Chapter 1 識認 Spring
用 使 您 許 允 也 但,)
Spring 是就也(
Setter injection 用 使 勵鼓
Type 2 IoC
完來 是或
Constructor injection用 使 要。)
T ype 3 Ioc ( Setter Constructor
好的件物賴依入注法方構建用使,定而求需的您視全完,入注係關賴依成
果如而然,立建的係關賴依成完併一,時同的件物構建在以可,是一之處
用使時這,數參的串長一告宣上式構建在須必則,多很係關件物的立建要
稱名法方的確明有
Setter 為 因,擇 選 的 錯 不 個 是 會 係 關 賴 依 入 注 來
Setter
須 必 比 會,稱 名 的 樣 這 用 使,型 類 或 用 作 的 件 物 入 注 解 瞭 於 用 可
setXXX()
。好得來要件物的表代所置位數參個某,上法方構建詢查或憶記
Type 1 IoC
物,面介作實求要會時
Type 1 IoC 用使, 是
Interface injection Type 1 IoC
可以所,法方的定規所上面介道知器容,面介個這用使會也器容的在所件
個一告宣中 的器容如例,入注的係關賴依成完來件物的面介作實叫呼 API
IDependency :
public interface IDependency {
public void createDependency(Map dependObjects);
}
讓,著接 Business 作實別類 IDependency :面介
public class Business implement IDependency {
private Map dependObjects; // 件物的賴依所錄記以用
public void createDependency(Map dependObjects) {
this.dependObject = dependObjects;
// 與現實邊這在
與現實邊這在
與現實邊這在 Business 係關賴依的
係關賴依的
係關賴依的
......
}
public void save() {
....
writer.saveToDevice();
}
}
1 1
16. 1 16
。性 靠 可 的 式 程 用 應 升
提幅大以可更,架框的熟成類這 Spring
過透,度程合耦的間之件物了低降
、寫撰式程的量大了少減僅不這, ) BusinessFactory
的前之如(係關賴依的
間之件物些這立建行自來式程些一寫撰地特必不您,係關賴依的間之件物
立 建 您 為 ,定 設 的 檔 態 組 據 根 期 時 行 執 在 Spring
讓,)案檔 個 .properties
一是或案檔 XML 個一(案檔態組寫撰過透,式方的式構建或 Setter
用以可並,期週命生的件物理管以可,器容 個是心核的 IoC Spring
。性用重的件
組低降而因,)架框(器容於依相件組或式程用應得使會,入注賴依現實
來 它 用使 ,性 入 侵 的 強較有 具 說 來 件 組 或 式 程 用 應 對 Type 1 IoC
以所
。 離 脫 中 器容從 法 無 件 組 得 使 後 最
,雜複加更會賴依的)架框(器容與件組,面介的雜複多更生產將中係關
賴依的雜複更在,式方作實的樣這想想。)份部式程的面介 IDependency
作實改修是就也(式程改修須必就,中之架框或器容的它其至器容個這前
目離脫算打 Business
後日果如, 的器容於賴依 API Business
得使就這,面
介的定規所器容現實 Business
求要 Type 1 IoC
於由,中子例的面上在
。立建的係關賴
依成完來法方 createDependency() 的 件 物 理 管 被 行 執 會 器 容,件 物 理 管 來
器 容 讓 並,面介 IDependency 現 實 須 必,件 物 的 入 注 係 關 賴 依 成 完 要 果 如
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
17. 1 17
件物的要想所您給會器容,器容叫呼要不 1.2 圖
。 用使中 Spring IDE Eclipse
在何如解了並,式程 個一第寫撰中 Spring Eclipse
在何如紹介將先首,念
觀的到紹介節章個這在個各會體,中用使與定設的 從接直將,始開 Spring
節章個一下從,邊這到談先就念概及語術的識認需所 門入於關 Spring
1.4 接下來的主題
Spring 識認 Chapter 1