對于IoC與依賴注入的一點理解

IOC是什么?

IoC is aimed at loosening the coupling of application components. The key concepts are:
? Components do not know each other directly.
? Components specify external dependencies using some kind of a key.
? Some "superior instance" (the IoC container, for example) resolves the dependencies once for each component and hereby "wires" the components together.
這里說了三個關鍵點,組件與組件互相不認識(也就是經常聽到解耦的概念),組件使用特殊的key來標識外部的依賴,一些高級的實例(比如IoC容器)解決組件之間相互依賴的問題并且將組件與組件之間連接起來。
對于我這種Java初學者來說,這幾個概念看起來是一臉懵逼,概念不明白,那么就先來一個個解答心中的小疑問吧。


什么叫解耦?

解耦這個概念很簡單,但是需要了解一些背景,在一個對象A中引用另外一個對象B,傳統(tǒng)的實現(xiàn)方式是在A中實例化一個B來使用:

    Public Class A(){
        B = new B();
}

這種情況下,就可以稱作A是依賴于B的,因為如果B的實例化有任何變動,在A中都需要修改實例化的代碼,在生產項目中對象之間將存在大量并且是多層的依賴關系,一個對象做修改之后可能會影響到幾十個依賴此對象的其他對象;另外還有一點,在進行單元測試的時候,測試方法無法Mock,因為在測試對象當中存在對于其他對象的實例化;
解耦方法非常簡單,在A中已參數(shù)形式引入一個B實例就可以了,A中不需要自己來對B進行實例化,這種方法也叫作依賴注入(Dependency Injection)

Public Class A(){
    Public setB(B b){
    This.b = b;
}
}

什么是IoC容器?容器如何實現(xiàn)控制反轉的?

在Spring當中的IoC容器可以用一張簡單的圖說明:

IoC示意圖.jpg

之前我們說依賴注入就是直接在對象當中引用已經實例化了的其他對象,那么這個實例化就是IoC容器幫我們實現(xiàn)的,IoC容器抽取配置數(shù)據(jù)以及項目中的各種對象構建為可以直接使用的各個實例;
由此可見,項目中的所有對象只需要和IoC容器建立關系就好了,而傳統(tǒng)的實現(xiàn)方式需要對象自己去實例化其他對象,對于程序的控制權一直在自己手上,有了IoC容器之后,在需要使用實例的時候將控制權交給IoC容器,由主動的控制變?yōu)楸粍涌刂?,控制權反轉了過來。


在Spring中如何實現(xiàn)依賴注入?

作為一個Spring初學者剛剛開始深入了解依賴注入實現(xiàn)的時候,Google一搜,各種概念、示例鋪天蓋地看得我頭都大了,Spring從最早的版本就已經支持依賴注入實現(xiàn)了,而現(xiàn)在已經演進到Spring Boot了,具體依賴注入的實現(xiàn)方法可以總結為三種類型:

  • 基于XML配置文件的依賴注入
  • 基于XML+Java代碼的依賴注入
  • 基于Java代碼(注解)的依賴注入

其實拋開實現(xiàn)方式的細節(jié),從上面的IoC容器原理圖我們可以看到,IoC容器要抽取配置數(shù)據(jù)以及項目中的各種對象,所以要配合IoC容器工作,需要給IoC容器提供配置數(shù)據(jù)以及將需要注入的各種對象注冊到容器,使容器能夠識別這些對象并且在實例化的時候能夠獲取到對象的聲明。


什么是Bean?

個人理解,Spring中的Bean就是能夠被IoC容器用來實例化的對象。在最新的Spring Boot中大多已經使用注解的方式來配置、注入Bean
這里簡單記錄一下幾種常用注解的含義:

  • @Springbootapplication: 此注解包含@configuration、@enableautoconfiguration、@componentscan三個注解,一般會在main函數(shù)處進行注解,對于Spring Web APP來說就是在根目錄的application.java的main函數(shù)里面用;
  • @configuration:表示這個class為多個beans的來源,一般會搭配@bean注解使用,在該class里面會有一系列工廠方法創(chuàng)建實例化對象(所謂工廠方法就是return各種實例對象)
  • @enableautoconfiguration:簡單理解就是Spring框架自動化實現(xiàn)的功能,它能從當前Spring項目的各個依賴包里面掃描Bean,注冊到IOC容器里面以備使用
  • @componentscan:表示Spring從指定的路徑中掃描Bean來注冊,這個注解里面是可以指定路徑參數(shù)的,如果未指定則默認為根路徑,比如在Main函數(shù)這里,就會掃描項目根目錄下各個子目錄中的Bean進行注冊,各種Bean包括@Service、@component、@Repository、@controller、@Bean這些注解配置的Bean
  • @Service:相當于@component,但是表示該Bean位于Service層,同樣的還有@controller表示bean為controller層,@repository表示bean在數(shù)據(jù)處理層(數(shù)據(jù)庫交互)
  • @bean:@configuration下面的工廠方法的注解
  • @autowired:此注解表示自動注入一個實例
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容