您好,登錄后才能下訂單哦!
spring框架為我們提供了三種注入方式,分別是set注入,構造方法注入,接口注入。今天就和大家一起來學習一下
依賴注入的基本概念
依賴注入(Dependecy Injection),也稱為IoC(Invert of Control),是一種有別于傳統(tǒng)的面向對象開發(fā)的思想,主要用于對應用進行解耦。簡單的理解就是說,本來是由應用服務自己創(chuàng)建的對象,數據,交給第三方來負責創(chuàng)建,準備,并且由第三方將對應的內容注入到應用服務中來,從而實現了對象的創(chuàng)建于對象的應用之間的解耦,通過這種方式,應用服務可以最小程度地減少與對象實體之前的關聯(只需要使用即可,而不關心其來源,對應的實現等等),從而保持了應用服務與對象之間的弱耦合關系。
依賴注入的簡單實現
可能通過文字的表達,對于依賴注入不是很好理解,不過,通過簡單的代碼實現,就可以很輕松的理解了,下面通過原始的做法以及依賴注入的做法來進行對比,來加深對依賴注入的理解
/** * 日志服務 */ class LogService{ // 注意這里,這里是手動創(chuàng)建對應的LogDao實例對象 private LogDao logDao = new DBLogDao(); public void save(){ logDao.save(); } } /** * 日志DAO接口 */ interface LogDao{ void save(); } /** * 日志DAO的具體實現,將日志保存到數據庫中 */ class DBLogDao implements LogDao{ @Override public void save() { System.out.println("Save to Database"); } }
從上面的代碼中可以看到,當需要LogDao對象的時候,是直接在服務中創(chuàng)建具體的實現,也就是new DBLogDao(),這種方式雖然方便,但是存在一定的缺點,比如說,當想要切換對應的實現,比如說XMLLogDao的時候,就需要打開對應的代碼,創(chuàng)建XMLLogDao對象,并且將其交給LogService;而且,如果LogDao的創(chuàng)建過程比較繁瑣的時候,LogService在這種實現方式中,就需要知道LogDao的實現過程,而這顯然是不太合理的,因為LogService只需要知道LogDao的存在,以及使用方式即可,而并不需要知道它的創(chuàng)建過程。
接下來來看下依賴注入或者說控制反轉是怎么解決這些問題的。
class LogService{ // 注意這里,這里并沒創(chuàng)建對應的對象 private LogDao logDao; // 通過屬性將LogDao注入到LogService中,這也就是依賴注入的來源 // 依賴別人講所需要的對象注入進來 public void setLogDao(LogDao logDao) { this.logDao = logDao; } public void save(){ logDao.save(); } } // LogDao接口及其實現DBLogDao同上,這里省略 /** * 模擬的容器類,負責創(chuàng)建各個對象,并且將對應的依賴對象注入進去 */ class Container{ public void create(){ // 創(chuàng)建對象 LogService logService = new LogService(); LogDao logDao = new DBLogDao(); // 注入LogDao對象 logService.setLogDao(logDao); } }
可能這里你會覺得說,create方法中也是手動創(chuàng)建了DBLogDao對象,其實不然,對于create方法來說,它只是負責創(chuàng)建對象,并不管對象的用途,也就是說,這里create方法可以通過各種其他手段,比如利用反射技術,再通過配置文件來配置對應的類的信息,這樣,當需要修改具體的實現的時候,只需要修改配置文件,create就會創(chuàng)建對應的對象,并且將其注入到LogService中,而這個過程對于LogService來說是透明的,LogService只知道自己有一個LogDao的對象,而不知道,也不需要知道LogDao對象是怎么來的。也就是實現了創(chuàng)建與使用的解耦。
至于控制反轉名詞,其實也是很顯然的嘛,本來是LogService自己創(chuàng)建的對象,現在將其交給Container來創(chuàng)建了,那么創(chuàng)建對象的權限不就是反轉了嘛^_^
一般來說,依賴注入有三種方式,分別是屬性注入,也就是上面我們看到的內容,還有一種是構造器注入,也就是通過構造器注入對應的對象,還有一種不常用的接口注入,其實本質上也是屬于屬性注入。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。