Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring 2.0 技術手冊第三章 - IoC 容器

4,026 views

Published on

Spring 2.0 技術手冊

Published in: Technology
  • Be the first to comment

Spring 2.0 技術手冊第三章 - IoC 容器

  1. 1. 。能功等播傳與理處的件事、析解息 訊 字 文、得 取 的 源 資 是 像,性 特 的 架 框 式 程 用 應 多 更 援 支 並,外 之能功理管器容的本基 如備具了除 BeanFactory ApplicationContext,) (架框式程用應個一為作,面方一另在 A pplication framework 。理管與態組的 種各行進器容 Bean Spring用使何如到解了以可將,中節章個一這在,在所點重的 解 Spring了是用運的 與 ApplicationContext 悉熟,上用使的器 BeanFactory容 心 核 在。係 關 賴 依 的 間 之 件 物 及 以,期 週 命 生 的 件 物 個 各 理 管 助 協以可,念概的 了作實,)IoC (器容個一是心核的 C ontainer Spring IoC 容器 3
  2. 2. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 3.1 Bean 基本管理 賴依「謂何解了致大並,式程 2 個一第成完際實經已中章 第在 Spring , 理管來能功器容的 ) 用使何如、 ( 入注 」 D ependency Injection Spring Bean ,式方定設的中 在 於關有多更到習學會將,中當節小個一這在 Bean Spring 。期週命生及以 3.1.1 BeanFactory、ApplicationContext 護維,成生、入載的件物理管,檔義定 取讀責負 BeanFactory Bean Bean 應 的 單 簡 於 對, 期 週 命 生 的 責 負, 係 關 賴 依 的 間 之 件 物 與 件 物 Bean Bean 上 理 管 的 件 物 在, 理 管 來 夠 足 經 已 就 BeanFactory 用 使,說 來 式 程 用 Bean :叫呼 以 可 法 方 個 六 了 括 包 面 介 , 性便方 的 多 許 得 獲 以 可 就 B eanFactory boolean containsBean(String) 試測 BeanFactory 的稱名定指所括包否是中 Bean 。 Object getBean(String) 定指 Bean 的應對相得取可即,稱名的定設中檔義定 Bean 。例實 Object getBean(String, Class) 的 應 對 相 得 取,稱 名 的 定 設 中 檔 義 定 定 指 Bean Bean (換 轉 並,例實 C ast ) 。別類的定指至 Class getType(String name) 定指 Bean 的應對相得取,稱名的定設中檔義定 Bean 之 Class 。例實 boolean isSingleton(String) 定指 Bean 的定指試測,稱名的定設中檔義定 Bean 之 scope 為否是 Singleton 。)明說會中 的 在後之( Bean scope String[] getAliases(String)3 2
  3. 3. Chapter 3 IoC 器容 該得取,稱名的定設中檔義定 Bean 定指 Bean 在後之(名別的有所 Bean 。)明說會中名別與稱名別識的,的夠不是能功的理管器容 供提只,架框式程用應個一為作過不 Bean用使以可則,能功器容的階進及以色特些一的供提所 Spring 用利要若 。org.springframework.context.ApplicationContext ApplicationContext間之 護 維 , 檔 義 定 取讀 責 負 有 具 也 , 立 建 而 BeanFactory 於基 Bean Bean的 需所式 程 用 應 個 一 供 提 還 此除, 能 功 等 係 關 賴 依 的 ApplicationContext : 如例, 能 功 架 框 的 整 完 更 (案檔源資得取供提 R esource file 。法方的便方更) 。法方的析解息訊字文供提 。息訊) (化際國援支 I nternationalization, I18N 的 趣 興 感 件 事 對,件 事 佈 發 以 可 ApplicationContext Bean 些這到收接以可 。件事 Spring 者始創的 Rod Johnson 代取來 ApplicationContext 用使議建BeanFactory 作實在, 是 概大的 用 使 常 最 , 中 別 類 的 ApplicationContext:個三下以 org.springframework.context.support.FileSystemXmlApplicationContext 定指可 XML 。檔義定取讀來徑路對絕或徑路對相的檔義定 org.springframework.context.support.ClassPathXmlApplicationContext 從 Classpath 取讀來中徑路定設 XML 。檔義定 org.springframework.web.context.support.XmlWebApplicationContext 在 Web 。檔義定取讀來置位對相定指,中構架案檔的中式程用應個一第的成完所中章 第將以可,說來子例的單簡個舉 2 Spring 中式程 :容內的下以為改修別類 SpringDemo 的 3 3
  4. 4. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) package onlyfun.caterpillar; import org.springframework.context.ApplicationContext; import org.springframework.context.support. ClassPathXmlApplicationContext; public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "beans-config.xml"); HelloBean hello = (HelloBean) context.getBean("helloBean"); System.out.println(hello.getHelloWord()); } } ApplicationContext 化例實在以可,檔義定 個多取讀以可 Bean ApplicationContext :如例,置位的檔義定 定指列陣以,時別類作實的 Bean ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"beans-config.xml", "beans-config2.xml"}); 、 用使以可您 file:/ classpath: 等 至甚 http:// URL 至甚,置前 的有所示表, classpath*: Classpath :配匹都徑路置前 ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:beans-config.xml"); 有所下 *取讀可子例的下以如例,元字 定指以可也 Classpath " beans" 果 如,用 有 中 統 系 案 檔 的 際實在 只 是 的 意 注 要 但 , 案 檔 定 設 XML 的頭開 . jar :效無就定指的下以則,話的中案檔 在是 ApplicationContext context = new ClassPathXmlApplicationContext("beans*.xml");3 4
  5. 5. Chapter 3 IoC 器容 與 將只 前 先 您 果 如 spring-beans.jar spring-core.jar 至入加 Classpath將須必 還 , 式 程 的 上 以 行執與 譯 編 能 了 為 則 , 中 spring-context.jar 入加 Classpath 。中定設的 至用使上以議建隊團發開 Bean,時檔義定 個多要需當 Spring不, 立 獨 自 各 間 之 檔 義 定 是 處 好 , 取 讀 來 式 方 的ApplicationContext Bean :如例,籤標 用使是 式 方 的 代 替 個 一 另。在 存 的 此 彼 到 識 意 用 < import><beans ...> <import resource="dao-config.xml"/> <import resource="resources/messageSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/></beans>個 一 同 在 置 放 須 必 檔 義 定, 前 之 籤 標 <import> 在置放須必籤標 < bean>義 定 個 每 而 ,置 位 檔 義 定 定 指 徑 路 對 相 以 ,中 之 Classpath 是或錄目 Bean 。籤標根 < beans> 括包須必都容內的檔換替 用使何如,時式程寫撰在紹介先邊這在 ApplicationContext等 佈 發 的 件 事、 理 管 的 息 訊 字 文 於BeanFactory ApplicationContext 於 關, 。 紹 介 一 一 中 題 主 的關相 後 往 在 將 也 , 能 功3.1.2 Bean 的識別名稱與別名當,稱名別識的 定指 用使以可時籤標 用使中檔義定在 < bean> " id" Bean的上稱名免以,式方名命的稱名 範規好最,時檔義定 個多要需您 Bean " id"定 在慮考如例,名別定設 為以可還您,後之性屬 定設在。突衝 " id" Bean A參要中檔義定 在而,例實 的 個一考參要中檔義 " device:dataSource" Bean B應在例實的 上際實但,例實 的 " user:dataSource" 個一考 Bean DataSource 3
  6. 6. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 定指例實該為式方的名別用使以可就則,個一在存只中式程用 :如例,稱名的 "device:dataSource"與 " user:dataSource" <beans ...> <bean id="app:dataSource" class="..."/> <alias name="app:dataSource" alias="device:dataSource"/> <alias name="app:dataSource" alias="user:dataSource"/> ... </beans> :如例 , 名 別 至 考 參 接 直 以 可 , 中 檔 義 定 在 則 A <beans ...> <bean id="device:someBean" class="..."> <property> <ref bean="device:dataSource"> </property> </bean> ... </beans> : 如例, 名 別 個 一 另 至 考 參以 可 也 , 中 檔 義 定 在 B <beans ...> <bean id="user:otherBean" class="..."> <property> <ref bean="user:dataSource"> </property> </bean> ... </beans> 個一同是的考參上際實而,範規定設稱名的己自有擁以可檔義定個兩 用使接直以可還,外之名別定設籤標 Bean < alias> 用使了除,例實 < bean> :如 例 , 隔 區 號 逗 以 間之名 別 個 多 而 , 名 別 定 設 來 性 屬 " name" 的籤標 <beans ...> <bean id="app:dataSource" name="device:dataSource,user:dataSoource" class="..."/> ... </beans>3 6
  7. 7. Chapter 3 IoC 器容3.1.3 Bean 的實例化個一化例實要中 在 Spring Bean 到看 所 止 為 前 目 到 , 式 方 種 幾 有 以 可 :式方的本基最是的<bean id="writer" class="onlyfun.caterpillar.FloppyWriter"/>的數參有沒是就也,式構建設預用使會將 ,式方定設的樣這依 S pring。 明說會將節一下,定設的式構建的數參有於關(例實 立建來式構建) Bean來) ( 法 方 廠 工 態 靜 過 透是式 方 種 一 的 上 計 設 在s tatic factory method細的立建件物解了用不件物的法方廠工態靜叫呼是處好,件物個某得取 :面介 IMusicBox個一 計 設 以 可 如 例 , 節 StaticFactoryMethodDemo IMusicBox.javapackage onlyfun.caterpillar;public interface IMusicBox { public void play();} 個一了計設您設假 MusicBoxFactory 得取, IBox 的它由節細的例實 :責負法方態靜createMusicBox() StaticFactoryMethodDemo MusicBoxFactory.javapackage onlyfun.caterpillar;public class MusicBoxFactory { public static IMusicBox createMusicBox() { return new IMusicBox() { public void play() { System.out.println(" …樂音琴鋼放撥 "); } }; }} 3 7
  8. 8. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 若 如 例 , 例 實 得取來 法 方 廠 工 態 靜 用 使 定 設 以 可 也 中 Spring 在 Bean 實的 得取來法方 MusicBoxFactory 的 createMusicBox() 過透要 IMusicBox :如例,性屬< bean> 的 定設以可則,例 " factory-method" StaticFactoryMethodDemo beans-config.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="musicBox" class="onlyfun.caterpillar.MusicBoxFactory" factory-method="createMusicBox"/> </beans> 取確正可否是定設的上以看看,式程試測的單簡個一寫撰以可來下接 IMusicBox :例實的 得 StaticFactoryMethodDemo SpringDemo.java package onlyfun.caterpillar; import org.springframework.context.ApplicationContext; import org.springframework.context.support. ClassPathXmlApplicationContext; public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml"); IMusicBox musicBox = (IMusicBox) context.getBean("musicBox"); musicBox.play(); } }3 8
  9. 9. Chapter 3 IoC 器容 :示所 圖 下 如 果 結 的 行 執 圖 3.1 StaticFactoryMethodDemo 果結行執案專法方廠工的例實 廠 工 個 某 用 使 要 想 您 果如 , 的 似 類 例 範 個 這 與 Bean 的 用使以可則,例實 得取來) f actory method Bean ( < bean> " factory-bean"得取來法方廠工定指性屬 Bean 用使並, 廠工定指性屬 " factory-metod"Bean :下如段片例範的定設個一如例,例實<!— 廠工 Bean 有上其, createInstance() --> 法方<bean id="factoryBean" class="onlyfun.caterpillar.SomeFactory"> ...</bean><bean id="some" factory-bean="factoryBean" factory-method="createInstance"/>,中 定 設 的 上 以 在 S pring 化例實會將 " factoryBean" 得取要而, " some" 用使會將,時例實的 " factoryBean"的 createInstance() 。得取來法方3.1.4 Bean 的 scope設預例實的得取 Spring 或 從,中 在 BeanFactory ApplicationContext 第在如例,例 實 個一 持 維只 稱名 Singleton 個一 每 為設預是就也, 為 Bean得取2 SpringDemo 過透次一每,中案專 章 factory.getBean ("helloBean") 。件物的新個一生產都次一每是不而,件物個一同是都上際實,件物的什有會不並說來式程的緒行執單對,例實一單生產式模 Singleton 用使) (全安緒行執到意注須必您,式程的緒行執多於對但,題問麼 T hread-safe 3
  10. 10. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 通,題問步同不料資的發引所源資用共取存時同緒行執個多止防,題議的 。) Singleton (的態狀無是都 的 Bean 常 S tateless 或 從次每,定設以可中 Spring 在而然 BeanFactory ApplicationContext : 如 例,例 實 的 新 個 一 生 產 都 時 得 取 並 名 別 定 指 Bean ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" scope="prototype"> ... 為定設其將由藉, Spring 是設預性屬 " scope" ,中 在 "singleton" 。 例實的 新 個 一 生 產 會 都 , 時 "prototype" 得取來稱名定指次每則, Bean 生產定設來, 或 為性屬 < bean> 的 定設由藉以可也您 " singleton" " true" " false" 相了為是要主,式方的性屬 Singleton 定設,式方的 為否是例實 " singleton" 。留保而式方定設 Spring 的本版前先於容 個一持維器容 個一「對針是要主 S pring 的 Singleton ,到意注要 IoC 不 Bean 的到談常上) (式模計設跟,言而」例實 D esign Pattern Singleton 的入 載 所 個每對是的說所, Singleton 的到談上式模計設,同 ClassLoader 。例實個一生產別類 與Spring 2.0 定設以可了除性屬 " scope" ,中 在 " singleton" " prototype" 與 、 定設以可還,境環式程用應 Web 對針,外之 " request" " session" 應 的 於 基 與 段階話 會 、 段 階 求 請 示 表 別 分 , "globalSession" Portlet Web 。段階話會式程用3 1
  11. 11. Chapter 3 IoC 器容3.1.5 Bean 的生命周期 用使是果如,段階行執個幾經歷會,毀銷到立建從 Bean 個一 :期週命生的下以援支量儘會,話的 理管、成生來BeanFactory Bean Bean 立建的 由 BeanFactory 取讀 Bean 個各成生並,檔義定 Bean 。例實 入注性屬 的關相行執 Bean 。入注賴依性屬 BeanNameAware 的 setBeanName() Bean 作實 有別類 果如 org.springframework.beans.factory.BeanNameAware 。法方 的它行執則,面介 setBeanName() BeanFactoryAware 的 setBeanFactory() Bean 作 實 有 別 類 果 如 org.springframework.beans.factory. 。法方 BeanFactoryAware 的它行執則,面介 setBeanFactory() BeanPostProcessors 的processBeforeInitialization() 的何任有果如 org.springframework.beans.factory.config.BeanPost- 的例實 Processors 行執則,聯關例實 Bean 與例實 BeanPostProcessors 。法方 processBeforeInitialization() InitializingBean 的 afterPropertiesSet() , Bean 作 實 有別類 果如 org.springframework.beans.factory.InitializingBean 。法方 的它行執則 afterPropertiesSet() Bean 義定中檔義定 init-method :如例,稱名法方定設性屬 Bean "init-method" 用使檔義定 在以可 ... <bean id="helloBean" 3 11
  12. 12. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) class="onlyfun.caterpillar.HelloBean" init-method="initBean"> ... 行執會就,時段階個這至行進則,話的定設上以有果如 initBean() 。法方 BeanPostProcessors 的 processaAfterInitialization() 行執則,聯關例實 與例實 的何任有果如 BeanPostProcessors Bean Bean- 。法方 PostProcessors 的例實 processaAfterInitialization() DisposableBean 的 destroy() 作 實 有 別 類 果 如,時 閉 關 器 容 在 Bean org.springframework.beans.factory. 。法方 DisposableBean 的它行執則,面介 destroy() Bean 義定中檔義定 destroy-method 法方定設性屬 用 使 檔 義 定 在 以 可,時 閉 關 器 容 在 Bean "destroy-method" :如例,稱名 ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" destroy-method="destroyBean"> ... 行執 會就,時段階 個這至行進 則,話的定設 上以有果如 destroyBean() 。法方 的 作 實 與 實 其 , 性 屬 "dohtem-tini" 的 >naeb< 義 定 InitializingBean ,法方始初的 義定以可,者前用採,的同相是義意 afterPropertiesSet() Bean 與,性屬 的 Spring 義定。 的 API 至合耦用不又而 < bean> " destroy-method" 可,者 前 用 採 , 同 相 是 也 義 意 法 方 DisposableBean 的面介 destroy() 作實 Bean 。 的 Spring API 至合耦用不 讓以 為名命都如例,稱名毀銷或稱名始初的定固有都 的有所果如 Bean init() destroy() 與 義定別分上 < bean> 在必不則, 或 " init-method" " destroy-method"3 12
  13. 13. Chapter 3 IoC 器容 在以可而,性屬 < beans> 義定上 " default-init-method" 與 " default-destroy-:如例,性屬method"<beans default-init-method="init" default-destroy-method="destroy"> ....</beans> 個每行執動自會 ,後之定設的上以如 S pring Bean 的義定所上 init() 與destroy() 。 夫功的 檔 定 設 寫 撰 少 不 去 省 以 可 , 法 方,同不有稍則話的 理管並成生來 ApplicationContext 用使是果如 Bean行執在,話的例實 理管及成生來 ApplicationContext 用使 Bean作實有上別類 若,後之段階BeanFactoryAware 的 setBeanFactory() Bean其行執則,面介org.springframework.context.ApplicationContextAware的 行進續繼才著接,法方setApplicationContext() BeanPostProcessors 。程流的後之及processBeforeInitialization(), 中 檔 義 定 叫 呼並前 之 器 容 閉 關 在 想 若 , 中 式 程 用 應 非 在 Web Bean行執以可則,法方Singleton Bean 的定設所 的 destroy 向,法方AbstractApplicationContext 的 registerShutdownHook() JVM :如 例 , 法 方 關 相 冊 註AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml");...context.registerShutdownHook();// …式程用應行執 ,前之 束 結 式 程 用 應 在 則 B ean 的定設所上檔義定 destroy 被會將法方 。行執叫呼,時 得 取 正 真 法 方 用使在有只, BeanFactory 用使果如 getBean() Bean 對針先預會則, 用 使 果 如。作 動 的 化 例 實 作 會 才 ApplicationContext Bean以 可則, 的 要 想 所 您 是 不 這 果 如 , 化 例 實 Bean 的有所 將 , 容 內 的 檔 義 定 3 13
  14. 14. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 定設上 在 < bean> 則, 為性屬 " lazy-init" " true" ApplicationContext 在會不就 該對針,時動啟 Bean :如 例 , 作 動 的 化 例 實 作 <bean id="some" class="onlyfun.caterpillar.Some" lazy-init="true"> ... </bean> 3.1.6 Bean 定義的繼承 義 定 的 些 有 ,到 現 發 您 而,長 增 的 斷 不 容 內 的 檔 義 定 果 如 Bean Bean 且,性屬等 與 有 都 義 定 個 幾 好 許也如 例 , 複 重 所 有 實 其 Bean " name" " age" 慮 考以可 則 , 定 設 的 同 不 有 會 個 幾 有 只 , 值的同 相 定 設 是 都 份 部 大 Bean Bean 。 夫 功的定 設 多 許 去 省 以 可 樣 這 , 義 定 個 某 承 繼 個一了寫撰您設假,承繼的義定 範示來子例的際實個舉 Bean SomeBean :下如別類 BeanInheritanceDemo SomeBean.java package onlyfun.caterpillar; public class SomeBean { private String name; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; }3 14
  15. 15. Chapter 3 IoC 器容} 的份部大中其,例實的 多 許生產 會許也 您 SomeBean SomeBean 其 "name": 義定下 如以可 則,同不 個幾有 只 , 與 "age" "guest" 18是都 性 屬 與 BeanInheritanceDemo beans-config.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="inheritedSomeBean" abstract="true"> <property name="name"> <value>guest</value> </property> <property name="age"> <value>18</value> </property> </bean> <bean id="some" class="onlyfun.caterpillar.SomeBean" parent="inheritedSomeBean"> <property name="name"> <value>Justin</value> </property> </bean></beans>象抽個是這示表, 為性屬 了定 設 中 "inheritedSomeBean" 在 "abstract" "true",性屬 了定 設 中 Bean 在而,化例實去試嘗會不 ,義定 的 Spring "some" "parent"為義定新重性屬 有只,定設的 承繼將它示表 " inheritedSomeBean" " name"為定設性屬的後最 個這"Justin" 看看來式程的單簡個寫以可。 " some" Bean :何 3 1
  16. 16. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) BeanInheritanceDemo SpringDemo.java package onlyfun.caterpillar; import org.springframework.context.ApplicationContext; import org.springframework.context.support. ClassPathXmlApplicationContext; public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml"); SomeBean some = (SomeBean) context.getBean("some"); System.out.println("name:" + some.getName()); System.out.println("age:" + some.getAge()); } } 為義定新重被 ,到看中果結行執在以可 " name" " Justin" 而, " age" 繼則 : 是就也, 了承 " inheritedSomeBean" 18 圖 3.2 BeanInheritanceDemo 果結行執案專 的象抽全完個一從了除 Bean 個一從以可也,外之定設關相承繼義定 Bean :如例,承繼來義定之例實 ... <bean id="inheritedSomeBean" class="onlyfun.caterpillar.SomeBean"> <property name="name"> <value>guest</value> </property> <property name="age"> <value>18</value>3 16
  17. 17. Chapter 3 IoC 器容 </property> </bean> <bean id="some" class="onlyfun.caterpillar.SomeBean" parent="inheritedSomeBean"> <property name="name"> <value>Justin</value> </property> </bean> ,中定設個這在 " inheritedSomeBean" 被以可也 Spring 必有若,化例實。義定其承繼 它其被以可也,要 Bean 3 17
  18. 18. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 3.2 Bean 的依賴設定 及 是式方入注賴依的本基種兩中 Spring 在 Setter Injection 了供提還,入注賴依的 非對針外另, Constructor Injection Singleton 賴依些一及以,入注賴依些這對針將,中節小個這在, Method Injection 。 明說以 加 式 方 的 定 設 係 關 3.2.1 Type 2 IoC、Type 3 IoC 的 用利,中式程 2 個 一第 的 成 完 所 中 章 第 在 Spring Bean Setter 法方 是就也, 是的勵鼓 S pring ,入注賴依成完 Setter Injection Type 2 的 Dependency Injection用使許允也但, Type 3 Dependency Injection 視是 係 關 賴 依 入 注 來 或 Constructor injection 用使要, Setter Constructor 用使中 在何如看看來先邊這,論討以加再後稍在這,定而求需 Spring :寫撰何如別類 Constructor injection 看看先首, HelloBean Type3Demo HelloBean.java package onlyfun.caterpillar; public class HelloBean { private String name; private String helloWord; //法方構建數參無有要議建 public HelloBean() { } public HelloBean(String name, String helloWord) { this.name = name; this.helloWord = helloWord; } public void setName(String name) { this.name = name; }3 18
  19. 19. Chapter 3 IoC 器容 public String getName() { return name; } public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { return helloWord; }}法方 構 建 數 參 無 用 使 有 以 可 Bean 讓能要了為,時別類 義定在 Spring有沒前目使即,法方構建的數參無個一義定以可議建,性彈的件物成生來 。容 內 作 實 的 何 任 寫 撰的上 法 方 構 建 的 數 參 有個二 第 , 是 的 意 注 要 中 義 定 別 類 HelloBean 在上定設在,時 B ean 用使中檔義定 ,序順之數參個兩 Constructor Injection : 示所下 如 , 定 指 來 序 順 的數參 上 法 方 構 建 依 以 可 Type3Demo beans-config.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="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg> <value>Justin</value> </constructor-arg> <constructor-arg> <value>Hello</value> </constructor-arg> </bean></beans> 3 1
  20. 20. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 用使將示 表來籤標 用使,中案檔義定在 <constructor-arg> Constructor 有擁時 Injection 如不並 用使於由, Constructor Injection Setter Injection 方個一另。序順的數參依須必時定指須必以所,稱名的懂易樣這 setXXX() 的中法 方 構 建 至 入 注 將 件 物 定 指 於 用 是 就 性 屬 " index" ,置位引索定指是式 二 第 , 是 值 引 索 的 數 參 個 一 第 , 中 定 指 序 順 的 數參, 數 參 的 置 位 個 一 哪 0 :寫撰麼這以可也中 1 如例,推類此依, 是個 beans-config.xml ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg index="0"> <value>Justin</value> </constructor-arg> <constructor-arg index="1"> <value>Hello</value> </constructor-arg> </bean> ... 生、 容 內 案 檔 義 定 取 讀 用使, 式 程 主 寫 撰 是 著 接 ApplicationContext Bean : 示 所 下 如寫撰 的 式 程 , 入 注 係 關 賴 依 成 完 、 例 實 成 Type3Demo SpringDemo.java package onlyfun.caterpillar; import org.springframework.context.ApplicationContext; import org.springframework.context.support. ClassPathXmlApplicationContext; public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "beans-config.xml"); HelloBean hello = (HelloBean) context.getBean("helloBean");3 2
  21. 21. Chapter 3 IoC 器容 System.out.print("Name: "); System.out.println(hello.getName()); System.out.print("Word: "); System.out.println(hello.getHelloWord()); }} :示所下如果結行執 圖 3.3 Type3Demo 果結行執案專型數 參 的 上 式 構 建 析 解 動 自 會 , 時 同 相數個 數 參 的 上 式 構 建 當 S pring : 如 例 , 式 構建個 哪 用 使 要 定 決 以 ,入注 賴 依 的 定 設 所 及 態...public class HelloBean { ... public HelloBean(String name) { ... } public HelloBean(Date date) { ... } ...}定指以可時構建在 HelloBean String定指以可也, java.util.Date ,件物 : 定 設麼這 是 中 檔 定 設 在 果 如 3 21
  22. 22. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) ... <bean id="date" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg> <ref bean="date"/> </constructor-arg> </bean> ... 用使並析解動自會 則,件物的態型 入注是中檔定設於由 Date Spring 也 您 , 件 物 的 賴 依 所入注 並 件 物 構 建 來 , 式 構 建 的 數 參 態 型 有 Date Date : 如 例 , 態型個 哪 用 使 要 定 指 確 明 來 性 屬 用 使 以 可 " type" ... <bean id="date" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg type="java.util.Date"> <ref bean="date"/> </constructor-arg> </bean> ... 實其,題問個這入注賴依成完來法方 Constructor 或 Setter用使要於至 或,源資的有所好備準就時立建件物在要:題問的老古個一論討在於等就 。定設行進來法方 用 使再, 後 好 立 建 件 物 在 是 Setter 賴依成完併一時同的件物構建在以可,是一之處好的 Constructor 用使 但,了好備準就也係關賴依的件物它其與它,後立建一件物,立建的係關 留上法方構建在會 用使,多很係關件物的立建要果如 Constructor injection 。擇 選 的 錯 不 個 是 會 法 方 用 使 時 這 , 憶 記 易不且 , 數 參 的 串 長 一 下 Setter 是會件物的入注解瞭以可稱名法方的確明有具法方 S etter ,面方一另 置位數參個某上 setXXX()憶記比會,稱名的樣這 是像,麼什 Constructor3 22
  23. 23. Chapter 3 IoC 器容 合 結 當,好 得 來 件 物 個 某 表 代 引 索 的 IDE 程 寫 撰 ,時 用 使 能 功 示 提 法 方 的 。率 效 有 且 便 方 更 會 式證保能不以所,法方 Setter有供提於由,時法方 用使而然 setXXX()可員人發開式程為因,定設改更被會不期時行執在源資或員成料資的關相或 員成料 資 些 一 讓 要 想 果 如以所 , 性 屬 關 相 定 設 來 法 方 Setter 行執接直能 。擇 選 的 單 簡 個 是 會 用 使 ,有私 是 或 讀 唯 為 變 源 資 Constructor injection3.2.2 依賴的值設定與參考接直中 或 在以可,時 義定在子例的前之 Bean < property> < constructor>構建或性屬給) (態型本基或串字個一定指,籤標 < value> 用使 p rimitive :如例,式... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg> <value>Justin</value> </constructor-arg> <property name="age"> <value>18</value> </property> </bean>... 用使接直以可也您 " value" 比種一是這,值態型本基或串字定指來性屬: 如例, 式 方 定 設 的 潔 簡 較... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg value="Justin"/> <property name="age" value="18"/> </bean>... 3 23
  24. 24. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 為性屬 個 某 定 設 要 想 果 如 null 用使以可,值 < null/> :如例,籤標 ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="name"><null/></property> </bean> ... 為定設是不而, 串字空為定設性屬串字將是,式方定設的下以意注 "" null : ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="name"><value></value></property> </bean> ... 的義定個一有經已中檔義定 在果如 Bean Bean 某讓接直以可則,例實 : 如 例 ,例實 個 這 至 考 參 性 屬 個 ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg> <ref bean="date"/> </constructor-arg> <property name="other"> <ref bean="otherBean"/> </property> </bean> ... 用 使 是 ,法寫 的 潔 簡 較 比 個 一 另 " ref" :如例,定指來性屬 ... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg ref="date"/> <property name="other" ref="otherBean"/> </bean> ...3 24
  25. 25. Chapter 3 IoC 器容它其考參 用使望希果如 < ref> Bean 的義定所,時例實 Bean 同在是須必定 指 以 可則, 中 之 案 檔 定 設 個 一 " local" :如例,性屬... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="other"> <ref local="otherBean"/> </property> </bean>...再 不 中 檔 義 定 在 後 之 ,次 一 考 參 性 屬 個 某 被 只 例 實 的 Bean 個某果如標 用使時義定性屬在接直以可也麼那,考參所性屬的 它其被 Bean <bean> :如例,可即性屬 "class" 其定指需僅並,籤... <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="helloWord"> <value>Hello!</value> </property> <property name="date"> <bean class="java.util.Date"/> </property> </bean>...的 Spring IoC 成生動自會器容 Date 過透並,例實 setDate() 將法方 Date 給定設例實 " helloBean"。個一另於賴依它果如,前之 個某得取在 Bean Bean 去先會就 S pring ,個 某 果 如。 入 注 賴 依 行 進 並 的 賴 依 被 化 例 實 Bean Bean 求 要, 前 之 成 生 在 定指以可則,化例實先須必 個一另 Bean " depends-on" :如例,定指來性屬 3 2
  26. 26. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <bean id="beanOne" class="onlyfun.caterpillar.BeanOne" depends-on="beanTwo"/> <bean id="beanTwo" class=onlyfun.caterpillar.BeanTwo" /> 設於由但,入注 求要確明有沒並 然雖,中例上在 " beanOne" " beanTwo" 會 ,前之 得取在則, " depends-on" 為性屬 了定 " beanTwo" " beanOne" S pring 在定設要 的上以個兩有果如,化例實 " beanTwo" 將先 Bean " depends-on" 。隔區號逗以則,中 3.2.3 自動綁定 用使、值態型本基、串字定指 Bean 用使中檔義定 在了除 < value> <ref> 屬 定指並籤標 用使是或,例實 它其至考參定指接直 Bean <bean> "class" 型類過透以可您。定綁動自的式隱援支也 S pring ,件物依相定指來性 應對 它其至定綁例實 個某將,) b yType b yName (稱 名或) Bean ( Bean 的 定 綁 種 各 範 示,例 為 式 程 的 中 案 專 AutoWireDemo 以 接 直 邊 這,性 屬 的 HelloBean :義定下如別類 設假,式方 AutoWireDemo HelloBean.java package onlyfun.caterpillar; import java.util.Date; public class HelloBean { private String helloWord; private Date date; public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { return helloWord;3 26
  27. 27. Chapter 3 IoC 器容 } public void setDate(Date date) { this.date = date; } public Date getDate() { return date; }} 中其 HelloBean 的下以在,例實的 個一受接法方 setDate() 的 Date Bean將, 中 檔 義 定 依作態型依動自 " autowire" 讓, 為定設性屬 " byType" Spring :定綁賴 AutoWireDemo beans-config.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="dateBean" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="byType"> <property name="helloWord" value="Hello!"/> </bean></beans>綁動自過透是而,性屬 的 定指有沒並,中檔義定在 " helloBean" Date的 據根會以所, "autowire" 了定指上性屬 "byType" 在,定 " helloBean"的 似類有 義 定 否 是 中 檔 義 定 在 斷 判 來 , 態 型 的 受 接 所 法 方setDate() Bean果 如,時 定 綁 動 自 用 使, 的 給 定 設 之 將 並,件 物 態 型 " helloBean" setDate()"byType" 出丟則,定綁成完法無 org.springrframework.beans.factory. 3 27
  28. 28. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) UnsatisfiedDependencyExcpetion 程試測的單簡個一寫撰以可。外例 : 成 完否是 係 關 賴 依 看 看 , 式 AutoWireDemo SpringDemo.java package onlyfun.caterpillar; import org.springframework.context.ApplicationContext; import org.springframework.context.support. ClassPathXmlApplicationContext; public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml"); HelloBean hello = (HelloBean) context.getBean("helloBean"); System.out.print("Word: "); System.out.println(hello.getHelloWord()); System.out.print("Date: "); System.out.println(hello.getDate()); } } : 示 所下如 面 畫 考 參 果 結 行 執 圖 3.4 AutoWireDemo 果結行執案專3 28
  29. 29. Chapter 3 IoC 器容 的時義定 據根會 "byName" 則,定綁來 定指以可也您Spring Bean "id"來子例個舉,定綁動自行進來致一否是稱名 Setter 與名別的定指上性屬必 則, 話 的 入 注 賴 依 成 完 來 法 方 "byName" 過透要而 是 果 如,說 setDate() 改修如例,稱名 Bean 為值 的 個一第下一改修須 " id" "date" beans-config.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="date" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="byName"> <property name="helloWord" value="Hello!"/> </bean></beans> "byName" 用使果如 的 應對則 , 定 綁 動 自 成 完 法 無 Setter 綁未持維僅 。態狀定是就 也 , 定 綁 動 自 用 套 時 用使在以可也 Type 3 Dependency Injection案專 改修若如例,定綁動自行進試嘗以可也上法方構建在 AutoWireDemo HelloBean :下如別類 的中package onlyfun.caterpillar;import java.util.Date;public class HelloBean { private String helloWord; private Date date; 3 2
  30. 30. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) // 法方構建的數參無個一留保議建 public HelloBean() { } public HelloBean(Date date) { this.date = date; } public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { return helloWord; } public void setDate(Date date) { this.date = date; } public Date getDate() { return date; } } 義定新重後然 beans-config.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="date" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="constructor"> <property name="helloWord" value="Hello!"/> </bean> </beans>3 3
  31. 31. Chapter 3 IoC 器容 ,時係關賴依立建在, "autowire" 為定設 "constructor" 於由 S pring型 數參之 上 法 方 構 建 的 關 相 及 , 態 型 例 實 Bean 的中器 容 對 比 圖 試 會 器 容 立建來法方構建該用選則,話的有果如,合符否是上態型在看看,態 Bean的 個這 與法方構建數參帶的 " helloBean" ,中 子 例 上 以 在 。 例 實 date Bean注例實 的中檔義定將並,例實構建來法方構建該用選是於,符相態型 date 出丟則,定綁成完法無果如,它給入 org.springframework.beans.factory. 。外例UnsatisfiedDependencyException,容內寫撰的檔義定短縮以可,式方的定綁動自些一用運,到看以可判來 給 交 切 一, 為 定 設 以 可 還,話 的 懶 偷 再 想 還 果 如 "autodetect" Spring : beans-config.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="date" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="autodetect"> <property name="helloWord" value="Hello!"/> </bean></beans>如用使試嘗會 "autowire" ,時 為定設被 "autodetect" 當S pring成完有 沒 果 如 , 立 建 的 係 關 賴 依 理 處 來"autowire" "constructor" 為定設被來式方的 為定設被 如 用 使 試嘗再 則 , 立 建 係 關 賴 依 "autowire" "byType" 。係關賴依立建 3 31
  32. 32. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 到看的楚清,中檔義定從法辦沒於由,中定綁動自式隱的紹介上以在 入加以可您,立建實確係關賴依些某定確了為,定設成完都性屬個每否是 四有以可, <bean> 定設時用使籤標 在,查檢依相 "dependency-check" 。 、 、 " simple" 、 " objects":式方查檢依相種 " all" " none" ) (生原是像,係關賴依成完否是性屬的單簡查檢只 "simple" p rimitive 賴依成 完 否 是 性 屬 的 態 型 件 物 查 檢 則 定 設 " objects" ;件 物 串 字 或 態 型 料 資 ,值設預是定設 " all" ; 係關賴 依 成 完 否 是 性 屬 的 部 全 查 檢 則 ; 係 關 " none" 。性依相查檢不示表 : 示所下 如 子 例 的 定 設 個 一 <?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="date" class="java.util.Date"/> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="autodetect" dependency-check="all"> <property name="helloWord" value="Hello!"/> </bean> </beans> 現發時查檢依相行進果如,定設查檢依相了入加時定綁動自用使旦一 出丟會時式程行執則,係關賴依的成完未有 org.springframework.beans. 。外例 factory.UnsatisfiedDependencyException ,係關賴依的間之件物出看查易容不上檔義定在,定綁動自用使於由 自用使才,時定確未求需或,型原發開速快要需式程用應在有只議建此因3 32
  33. 33. Chapter 3 IoC 器容功式程用應後之,作工定設態組的碎瑣時發開期初化簡以,能功的定綁動 。 係 關 賴依的 間 件 物 與 件 物 定 設的楚 清 就 , 後 之 定 確 能3.2.4 集合物件在,件物合集等 、 j ava.util.List 、 、列陣於對 j ava.util.Set j ava.util.Map的需所至入注件物合集將再後然,中合集至件物些一入充填須必若前入注並 ,件物 合 集 成 生 或 護 維 動 自 來 器 容 的Bean Spring 由交以可也,時 IoC 。入注賴依成完定別類 個 有若如 例 , 範 示 作 式 程 用應的 整 完 個 舉 接 直 邊 這 SomeBean :下如義 CollectionDemo SomeBean.javapackage onlyfun.caterpillar;import java.util.List;import java.util.Map;public class SomeBean { private String[] someStrArray; private Some[] someObjArray; private List someList; private Map someMap; public String[] getSomeStrArray() { return someStrArray; } public void setSomeStrArray(String[] someStrArray) { this.someStrArray = someStrArray; } public Some[] getSomeObjArray() { return someObjArray; } 3 33
  34. 34. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) public void setSomeObjArray(Some[] someObjArray) { this.someObjArray = someObjArray; } public List getSomeList() { return someList; } public void setSomeList(List someList) { this.someList = someList; } public Map getSomeMap() { return someMap; } public void setSomeMap(Map someMap) { this.someMap = someMap; } } 與 、列 陣 些 一 義 定 的 單 簡 是 只 中 別 類 SomeBean 在 L ist Map 稍,性 屬 在,入注成生來 由 將 件 物依相 的 需 所 性 屬 些 這 後 Spring SomeBean 使還中 Some :下如容內其,別類 到用 CollectionDemo Some.java package onlyfun.caterpillar; public class Some { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }3 34
  35. 35. Chapter 3 IoC 器容 public String toString() { return name; }} 用 使 是 時 檔 義 定寫撰 在 , 入 注 係 關 賴 依 的 態 型 或 列 陣 於 對 List <list>的它其至考參來 用使是或,串字定指籤標 <value> 用使並,籤標<ref> ,籤標Bean 用 使 是則入 注 係 關 賴 依 的 態 型 於 對 ; 例 實 Map <map> M ap 用使後然, 定指籤標 key-value 用要您以所, <entry> 定指須必 key <value> 。例實 的它其至考參來 <ref> 用使是 或 , 串 字 定 指 籤 標 Bean :下如寫撰義定 CollectionDemo 的案專 beans-config.xml CollectionDemo beans-config.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="some1" class="onlyfun.caterpillar.Some"> <property name="name" value="Justin"/> </bean> <bean id="some2" class="onlyfun.caterpillar.Some"> <property name="name" value="momor"/> </bean> <bean id="someBean" class="onlyfun.caterpillar.SomeBean"> <property name="someStrArray"> <list> <value>Hello</value> <value>Welcome</value> </list> </property> 3 3
  36. 36. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <property name="someObjArray"> <list> <ref bean="some1"/> <ref bean="some2"/> </list> </property> <property name="someList"> <list> <value>ListTest</value> <ref bean="some1"/> <ref bean="some2"/> </list> </property> <property name="someMap"> <map> <entry key="MapTest"> <value>Hello!Justin!</value> </entry> <entry key="someKey1"> <ref bean="some1"/> </entry> </map> </property> </bean> </beans> 您,立建的期預如否是係關賴依及以,確正否是寫撰檔義定試測了為 : 式 程 試測的 下 如 個 一 寫 撰 以 可 CollectionDemo SpringDemo.java package onlyfun.caterpillar; import java.util.List; import java.util.Map; import org.springframework.context.ApplicationContext; import org.springframework.context.support.3 36
  37. 37. Chapter 3 IoC 器容 ClassPathXmlApplicationContext;public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "beans-config.xml"); SomeBean someBean = (SomeBean) context.getBean("someBean"); //件物入注賴依態型列陣得取 String[] strs = (String[]) someBean.getSomeStrArray(); Some[] somes = (Some[]) someBean.getSomeObjArray(); for(int i = 0; i < strs.length; i++) { System.out.println(strs[i] + "," + somes[i].getName()); } //得取 List件物入注賴依態型 System.out.println(); List someList = (List) someBean.getSomeList(); for(int i = 0; i < someList.size(); i++) { System.out.println(someList.get(i)); } //得取 Map件物入注賴依態型 System.out.println(); Map someMap = (Map) someBean.getSomeMap(); System.out.println(someMap.get("MapTest")); System.out.println(someMap.get("someKey1")); }} :示 所 下 如 果 結 的 行 執 3 37
  38. 38. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 圖 3.5 CollectionDemo 果結行執案專 定設在 Map ,時入注 < entry> :式形的下以本原,上定設的籤標 <entry key="MapTest"> <value>Hello!Justin!</value> </entry> :為寫撰以可還 <entry key="MapTest" value="Hello!Justin!"/> 果如 key-value 個某至考參要別分 Bean 方的下以為寫撰以可則,例實 :式 <entry> <key> <ref bean="myKeyBean"/> </key> <ref bean="myValueBean"/> </entry> : 潔簡為 更 上 寫 撰 在 , 式 型的下 以 為 寫 撰 以 可 還 您 <entry key-ref="myKeyBean" value-ref="myValueBean"/> 會許 也,時 件 物 合 集 義 定 在,本 版 的 上 以 是 的 用 使 所 您 果 如 JDK 5.0 : 如 例 , 態 型 的 放 存所件 物 合 集 義 定 來 能 功 的 ) G eneric (型泛用使3 38
  39. 39. Chapter 3 IoC 器容public class Some { private Map<String, Float> somes; public void setSomes(Map<String, Float> somes) { this.somes = somes; }} ,時 入 注 賴 依 行 進 在 則 S pring 將再,作動的換轉態型作性屬為試嘗會: 如 例,中 之 件 物 合 集 入 放 之... <bean id="some" class="onlyfun.caterpillar.Some"> <property name="somes"> <map> <entry key="Justin" value="99.99"/> <entry key="momor" value="99.75"/> </map> </property> </bean>...將會 ,下之定設的樣這在 S pring key , 為換轉值的 String v alue 定設的 中別類 合符以, 為換轉 Float Some somes 。告宣型泛的性屬是的入注要果如 java.util.Set 用使則,話的態型 <set> 設個一,籤標:示所下如段片的定...<set> <value>a set element</value> <ref bean="otherBean"/> <ref bean="anotherBean"/></set>... 的入注要若java.util.Properties 用使則,態型 < props> 與 < prop> ,籤 標Bean :下如範示法寫的檔義定 3 3
  40. 40. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <bean id=....> .... <property name="someProperties"> <props> <prop key="someProkey1">someProValue1</prop> <prop key="someProkey2">someProValue2</prop> </props> </property> </bean> 定設件物合集為慮考要則,件物個一入注只不件物合集的您果如 " id" 用使要則,件物 是若如例,稱名 List org.springframework.beans.factory. :示所下如,義定來 config.ListFactoryBean <bean id="emails" class="org.springframework.beans.factory.config.ListFactoryBean"> <property name="sourceList"> <list> <value>justin@caterpillar.onlyfun</value> <value>momor@caterpillar.onlyfun</value> </list> </property> </bean> 是果如 Map :定設下如以可則,件物 <bean id="emails" class="org.springframework.beans.factory.config.MapFactoryBean"> <property name="sourceMap"> <map> <entry key="justin" value="justin@caterpillar.onlyfun"/> <entry key="momor" value="momor@caterpillar.onlyfun"/> </map> </property> </bean> :定設下如以可則,件物 是果如 Set <bean id="emails" class="org.springframework.beans.factory.config.SetFactoryBean">3 4
  41. 41. Chapter 3 IoC 器容 <property name="sourceSet"> <set> <value>justin@caterpillar.onlyfun</value> <value>momor@caterpillar.onlyfun</value> </set> </property></bean> 是果如 P roperties 用使以可則,態型 o rg.springframework.beans.factory. :如例,config.PropertiesFactoryBean<bean id="propConfiguration" class="org.springframework.beans. factory.config.PropertiesFactoryBean"> → <props> <prop key="someProkey1">someProValue1</prop> <prop key="someProkey2">someProValue2</prop> </props></bean>用使 是 或 "location" 定指,性屬 .properties 取讀中從,置位的案檔 Properties:如例,料資<bean id="businessConfig" class="org.springframework.beans. → factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:onlyfun/caterpillar/config.properties"/></bean>與這, 併 合 的 件 物 合 集 援 支 還 , 中 Spring 2.0 在 3.1.6 的到談 Bean 定 :如 例 , 似 類 承 繼 之 義 <bean id="parent" abstract="true" class="onlyfun.caterpillar.Some"> <property name="someProperties"> <props> <prop key="someProkey1">someProValue1</prop> <prop key="someProkey2">someProValue2</prop> </props> </property> 3 41
  42. 42. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) </bean> <bean id="child" parent="parent"> <property name="someProperties"> <props merge="true"> <prop key="someProkey2">otherProValue2</prop> <prop key="someProkey3">someProValue3</prop> </props> </property> </bean> 為性屬 了定設 的中 " child" 到意注 < props> " merge" " true" 定設的上以, 義定新重,義定的中 承繼會將, " child" 的得取所 " parent" " someProKey2" 為 增新並, " otherProValue2" 為" someProKey3" " someProValue3" 是就也, :案檔 的下 以 義 定 於 當 相 後 最 . properties someProKey1=someProValue1 someProKey2=otherProValue2 someProKey3=someProValue3 3.2.5 Spring 2.0 的<util>標籤 可則,定設檔義定 的 於基用使若中 Spring 2.0 在 XML Schema XML 省便方為更時義定 定設在籤標 。充擴籤標 的增新入加以 < util> < util> Bean 在須必,籤標 用使要,助幫的大很有化簡的檔定設 XML 於對,事 < util> XML :) (間空稱名 入加中 util n amespace <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> ... </beans>3 42
  43. 43. Chapter 3 IoC 器容用使別分以可,化簡的上定設件物合集於籤標 紹介來先首 < util>先代取來,籤標等<util:list> 、 、 < util:map> 、 < util:set> < util:properties>與 、 、 的紹介所前 ListFactoryBean MapFactoryBean SetFactoryBean其將以可,例為案專 以先邊這。PropertiesFactoryBean CollectionDemoXML :容內的下以為換更檔定設<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> <bean id="some1" class="onlyfun.caterpillar.Some"> <property name="name" value="Justin"/> </bean> <bean id="some2" class="onlyfun.caterpillar.Some"> <property name="name" value="momor"/> </bean> <util:list id="strArray"> <value>Hello</value> <value>Welcome</value> </util:list> <util:list id="objArray"> <ref bean="some1"/> <ref bean="some2"/> </util:list> <util:list id="list" list-class="java.util.ArrayList"> <value>ListTest</value> <ref bean="some1"/> <ref bean="some2"/> </util:list> 3 43
  44. 44. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <util:map id="map" map-class="java.util.HashMap"> <entry key="MapTest" value="Hello!Justin!"/> <entry key="someKey1" value-ref="some1"/> </util:map> <bean id="someBean" class="onlyfun.caterpillar.SomeBean"> <property name="someStrArray" ref="strArray"/> <property name="someObjArray" ref="objArray"/> <property name="someList" ref="list"/> <property name="someMap" ref="map"/> </bean> </beans> 若,件物合集的用使要所定指以可性屬 、 " list-class" 中其 " map-class" 籤標 是下以。件物器容的作實定決行自器容由則,定指不 < util:properties> :例範用使的 <util:properties id="businessConfig" location="classpath:onlyfun/caterpillar/cpnfig.properties"/> 是下以 < util:set> ,的樣同,例範用使的 " set-class" 物合集定指來用可 :態型的用使所件 <util:set id="emails" set-class="java.util.TreeSet"> <value>justin@caterpillar.onlyfun</value> <value>momor@caterpillar.onlyfun</value> </util:set> 有還,外之籤標 的紹介所邊這了除 < util> < util:constant> 靜定設來用可 定設於免而,) (員成料資態 s tatic field org.springframework.beans.factory. :如例, config.FieldRetrievingFactoryBean <bean id="..." class="..."> <property name="someProperty"> <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/> </property> </bean>3 44
  45. 45. Chapter 3 IoC 器容個某為以可,籤標 用使以可還 < util:property-path> Bean 設員成性屬的 定設於免以,中之理管器容於可之使,稱名 定 " id" org.springframework.:如例,beans.factory.config.PropertyPathFactoryBean<bean id="someBean" class="onlyfun.caterpillar.SomeBean"> <property name="name" value="guest"/></bean><!—id name 為 Bean 的 是會將值其, someBean.name--><util:property-path id="name" path="someBean.name"/>3.2.6 Lookup Method Injection 個一計設要在現設假 Singleton 的 叫 呼 當, MessageManager display()的 立 建 新 統系個 一 得 取 會 , 時 法 方 Message :如 例 , 示 顯 以 加 並 件 物 LookupMethodInjectionDemo MessageManager.javapackage onlyfun.caterpillar;public abstract class MessageManager { public void display() { Message message = createMessage(); System.out.println(message); } protected abstract Message createMessage();}集 收 的 單 簡 只 則 例 範 的邊 這 在 , 訊 資 關 相 的 時 當 統 系 了 集 收 Message :訊資間時的統系 3 4
  46. 46. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) LookupMethodInjectionDemo Message.java package onlyfun.caterpillar; import java.util.Date; public class Message { private String sysMessage; public Message() { sysMessage = " :訊資統系 " + new Date().toString(); } public String toString() { return sysMessage; } } 個一 之使,法方 作實接直式程寫撰想不邊這在 createMessage() new 的件物 Message 入注並生產來 過透望希而,回傳並件物 Spring Message 將,中檔定設 在的純單。性彈的 換抽在得獲以,話 Message XML Message 過透在有只,定設麼這為因,的通不行是 " scope" 定設性屬 的 " prototype" 會才,時 得取來 BeanFactory 的 或 ApplicationContext getBean() Message 。 Message 個一化例實新重 用使, 的 用使以可時這 Spring Lookup Method Injection < lookup- ,入注行進並件物的新生產,法方的 個某用使定指可,籤標 method> Bean XML :寫撰麼這以可,中檔定設 在如例 LookupMethodInjectionDemo beans-config.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/beans3 46
  47. 47. Chapter 3 IoC 器容 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="sysMessage" class="onlyfun.caterpillar.Message" scope="prototype"/> <bean id="messageManager" class="onlyfun.caterpillar.MessageManager"> <lookup-method name="createMessage" bean="sysMessage"/> </bean></beans>子的 個一生產 用使將 S pring ,下之定設麼這 CGLIB MessageManager呼次每在且並,)中之 入加 的 將要 以 所 ( 作 實 別 類 CGLIB . jar Classpath一用使以可,回傳並件物 個一立建,時法方 createMessage() 到叫 Message : 果 結 行執範 示 來 式 程 的 單 簡 個 LookupMethodInjectionDemo SpringDemo.javapackage onlyfun.caterpillar;import org.springframework.context.ApplicationContext;import org.springframework.context.support. ClassPathXmlApplicationContext;public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "beans-config.xml"); MessageManager messageManager = (MessageManager) context.getBean("messageManager"); try { messageManager.display(); Thread.sleep(1000); messageManager.display(); Thread.sleep(1000); messageManager.display(); } catch (InterruptedException e) { e.printStackTrace(); } 3 47
  48. 48. 3 48 。 明說與例範關 相的3 .3.8.2. Arbitrary method replacement ,中當件 文考 參 考參接直 以可 Spring,趣興有若。件物的來原改修用不而,作實法方的件物個某代取的步一進更以可 , Arbitrary method replacement 的用 常不更個 一供提還 中 Spring 。中之 MessageManager 入注件物 Message 的定指將,作實供提 Spring由, createMessage() 法 方 定 指 以 可 它,到 看 以 可 中 子 例 的 際 實 從,一 之 案方決解 Method Injection 的供提所 Spring 是 Lookup Method Injection 果結行執案專 3.6 LookupMethodInjectionDemo 圖 :件物 Message 的新生 產 都 次 每 實 確 到 看,中果 結 的 行 執 從 以 可 , 生 產 新 重 實 確 否 是 件 物 Message 察觀以,訊資間時的統系隔區,秒毫 1000 停暫間之 display() 叫呼 次 每 在 意 故 中 式 程 } } ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  49. 49. Chapter 3 IoC 器容3.3 Bean 進階管理到識意要需不件組些這是況情的好最,說來件組式程用應於對上想理可 您 而 然, 關 相 的Spring 到 用 使 不 是 就 說 來 體 具,在 存 的 器 容 Spring API於關有知得式程些這讓,式程務服 些一寫撰件組式程用應為以 Spring您,面方一另。能功些一的供提所Spring 得 獲 以,息 訊 些 一 的 器 容 Spring進些一供提節小個這,理處外額些一行進件組式程用應對器容讓須必能可 Bean 。式方的理管與定設 的階3.3.1 非 XML 定義檔的組態方式 ,檔義定為作 用使都式程範示 Spring 個每的到見所前先在 XML X ML (案專碼始原放開的多許此因也,定設態組於用適式格層階的案檔 O pen非 供提會 也 常 通 但 , 式 方 義 定 態 組 的 設 預 為 作source project XML 將都)XML ,式方定設的 案檔性屬供提如例,式方的檔義定 .properties S pring 。 義定 .properties 案檔性屬用使以可也 Bean :別類 個 一 了 義 定 您 設 假,說 來 子 例 的 際 實 個 舉 HelloBean PropertiesDemo HelloBean.javapackage onlyfun.caterpillar;public class HelloBean { private String helloWord; public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { return helloWord; } 3 4
  50. 50. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) } 個一寫撰改邊這在 beans-config.properties 義定來 Bean 等入注 賴 依 與 :容內 PropertiesDemo beans-config.properties helloBean.(class)=onlyfun.caterpillar.HelloBean helloBean.helloWord=Welcome 定指於用 ,定設名別的 是即稱名"helloBean" 中檔性屬 Bean . (class) 有還如例,定設性屬的需所檔義定 示表號括有,源來別類 Bean 其於至,定設以可等 . (abstract)、 、 . (parent) 、 如 . (lazy-init) . (singleton) 考參要果如,稱名性屬的 為即 如例,式方定設性屬的它 " .helloWord" Bean 用使以可。 Bean 用使則, 的在存已 " .helloWorld(ref)" org.springframework. 讀,檔性屬取讀來 beans.factory.support.PropertiesBeanDefinitionReader :下 如 式 程 範 示 之 義 定 的 中 案 檔 .properties 取 PropertiesDemo SpringDemo.java package onlyfun.caterpillar; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory. support.BeanDefinitionRegistry; import org.springframework.beans.factory. support.DefaultListableBeanFactory; import org.springframework.beans.factory. support.PropertiesBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; public class SpringDemo { public static void main(String[] args) { BeanDefinitionRegistry reg = new DefaultListableBeanFactory(); PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);3

×