我所理解的依賴注入,控制反轉,面向切面


依賴注入(Dependency Injection)

簡單來說,一般的java或者面向對象思想的程序的架構,大量使用了“組合”這一實現方式,也就是在一個對象內部持有了別的對象的引用,來實現多個對象的交互。這些引用一般由程序員控制。回想起我的五子棋,確實如此,最簡單的方式就是持有引用。

但這會導致一個很明顯的問題:代碼耦合度過大,換句話說,本來該分成一塊一塊的代碼,全部因為持有引用耦合在了一起。一個方法名字參數要修改,可能持有這個對象的所有地方的代碼都需要修改。同時維護起來會很困難,錯誤由各個地方的引用導致,又隨着引用的持有傳播。再者違背了面向對象的思想,一個東西內部也許從邏輯上和某個對象無關,可是卻為了方便持有了其引用。

Spring In Action里面寫騎士類的例子很好。

那么解決方法是什么呢?那就是依賴一種注入關系,具體需要持有引用的時候“注入”一個引用。其實這一種思想也不是啥特別冷僻的東西。在構造器中傳入引用賦值給一個實例變量也就是一種注入。不過這么做不好。因為會讓問題復雜化。更理想的方式是通過xml文件裝配它。

 

面向切面(Aspect Oriented Programming)

一些程序中,有的邏輯模塊可能在多個地方都會被使用。比如日志,安全等。這會導致兩個問題。

1,如果這類邏輯要修改,可能到處都要修改。2,你的代碼會變得混亂,因為不僅要完成自己本來的功能,還要去寫日志等等。

而面向切面是說:把這種邏輯模塊定義為“切面”。在xml文件中定義這個切面,並且控制在切面時程序的行為,“寫日志”或者“驗證安全性”等等。

 

控制反轉(Inversion of Control)

使用一個Spring容器通過依賴注入控制各個組件的耦合。也就是說你寫好了組件,不需要你去自己控制他們的依賴關系,哪個類又持有哪個類的對象,哪個類里面又要聲明一個對象,而是把他們都放到一個容器里面,容器替你做這個(把組件組合起來)。

有兩種實現形式:Bean工廠,應用上下文。其中第一種過於低級。目前主要使用的是第二種。第二種直接理解就是通過xml文件控制組件的耦合關系。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM