Guice和JavaConfig:使用Annotation進行反轉控制的兩種方式
隨著 Guice 的最初發行版慢慢塵埃落定,將它和 Spring IoC,尤其是和 Spring JavaConfig 進行的比較也隨之浮出水面。Guice 和 JavaConfig 採取了兩種不同的方式使用 Java Annotations 將 IoC 配置放入程式碼。
目前 Spring JavaConfig 釋出了 1.0 Milestone 1 版本,它和 Guice 的基本想法是一致的——把配置從 XML 移至 Annotation 是一種更好的做法,因為這樣使得配置資訊與程式碼更為緊密。Tapestry 的 IoC 容器也是根據同樣的想法設計的。
JavaConfig 和 Guice 的背景極其相似。事實上,Bob Lee 是這樣敘述它們的歷史的:
此外,我還想說一個有點意思的小故事:Guice 最開始的時候和 Spring JavaConfig 看起來非常像——這並不奇怪,因為 Rod 一年前向我展示了 Spring JavaConfig(而六個月前我又讓他看了 Guice)。正如使用 JavaConfig 一樣,你得顯式地寫 Java 程式碼來連線你的物件。我從一開始就引入 @Inject 做為檢查外部程式碼按照你的安排呼叫所有的 setters 的一種可選方式。而自打我們有了 @Inject,我開始問,我們為什麼還需要顯式地編寫物件連線程式碼呢?於是很快我們就有大家今天所知道的 Guice。
關於 Guice 和 JavaConfig 區別的帖子有不少。Debasish Ghosh 恰如其分地總結到:
Guice 和 Spring 之間最主要的區別,可以歸結為它們看待依賴關係和配置的哲學之間的差異。Spring 宣揚的是非侵入性的方式,以一種完全外部化的方式來對待物件依賴關係。在 Spring 裡,你可以使用 XML、Spring JavaConfig 或者 Groovy-Spring DSL 來連線物件依賴關係,也可以使用其它的方案,如 Spring-annotations。但是,不管你用的是什麼技術,依賴關係總是被外部化的。
另一方面,Guice 卻把配置做為你的應用程式模型的首要物件來看待,允許它們存在於你的領域模型程式碼中。我們使用 Guice 模組來說明需要注入什麼東西,然後使用 annotations 來指明需要在什麼注入。你可以使用注入來標記(annotate)類本深(通過 @Inject annotation)。缺點則是(如果你使者麼認為的話)你必須在你的領域模型中引入 com.google.inject.*。但它通過後設資料程式設計(metadata programming)來確保了目標的方向性,以及注入的顯式語義。
在這些文章的回帖中,你可以發現,在這兩個框架之間做選擇的時候,最值得注意的就是它們設計哲學的區別。你會希望依賴注入和程式碼靠得有多近呢?如果使用 Guice,你的程式碼將和容器緊密耦合在一起,這樣做有些人喜歡,有些人反感。Guice 號稱自己的速度更快,但值得注意的是,Spring IoC 容器(不管是 JavaConfig 還是其它)支援多種鉤子,而 Guice 並沒有提供。Spring 為大家帶來的不僅僅是 IoC,而 Guice 並不打算解決那些大問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-211676/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python進行開發的兩種方式Python
- ChatTTS的兩種使用方式TTS
- sparkrdd轉dataframe的兩種方式Spark
- 如何使用常用的6種方式對資料進行轉換(二)
- 客戶的一個緊急bug,我用了兩種方式進行 C# 反編譯修改原始碼C#編譯原始碼
- ABAP和XML資料格式互相轉換的兩種方式XML
- 多執行緒的建立 兩種方式以及使用建議執行緒
- 用最簡單的方式理解 IoC 控制反轉
- java執行緒建立的兩種方式Java執行緒
- XML解析的兩種方式DOM和SAXXML
- ubuntu建立使用者的兩種方式Ubuntu
- springboot使用webSocket的兩種方式Spring BootWeb
- VB中檔案操作的兩種方式 (轉)
- react-router4.2使用js控制路由跳轉的3種方式ReactJS路由
- Java執行groovy指令碼的兩種方式Java指令碼
- 易語言執行js的兩種方式JS
- 依賴注入和控制反轉依賴注入
- 使用GoldenGate初始化的兩種方式Go
- 將一個字串進行反轉:將字串中指定部分進行反轉。比如“abcdefg”反轉為”abfedcg”字串
- C#轉義字元的兩種處理方式C#字元
- base64轉file檔案的兩種方式
- C# Winform 設定焦點控制元件的兩種方式和注意事項C#ORM控制元件
- java 控制反轉和依賴注入的理解Java依賴注入
- 轉享: 在Scala中使用GuiceGUI
- sql trace有兩種方法在session級進行trace(轉)SQLSession
- 【演算法題】反轉連結串列的兩種方法演算法
- Activity和Service跨程式通訊的兩種方式
- Laravel 的觀察者使用記錄與兩種方式Laravel
- 使用位運算、值交換等方式反轉java字串-共四種方法Java字串
- 關於多執行緒的兩種實現方式執行緒
- Java多執行緒13:讀寫鎖和兩種同步方式的對比Java執行緒
- Spring 控制反轉和依賴注入Spring依賴注入
- JS 垃圾回收的兩種方式JS
- Docker打包映象的兩種方式Docker
- 提交Application的兩種方式APP
- 建立Session物件的兩種方式Session物件
- CentOS安裝MySQL的兩種方式——RPM和YUMCentOSMySql
- 在springboot中使用Mybatis Generator的兩種方式Spring BootMyBatis