【Spring】IOC&DI

hudad發表於2024-06-18
  • 控制反轉: Inversion Of Control,簡稱IOC。物件的建立控制權由程式自身轉移到外部(容器),這種思想稱為控制反轉。

    物件的建立權由程式設計師主動建立轉移到容器(由容器建立、管理物件)。這個容器稱為:IOC容器或Spring容器

  • 依賴注入: Dependency Injection,簡稱DI。容器為應用程式提供執行時,所依賴的資源,稱之為依賴注入。

    程式執行時需要某個資源,此時容器就為其提供這個資源。

    例:EmpController程式執行時需要EmpService物件,Spring容器就為其提供並注入EmpService物件

IOC容器中建立、管理的物件,稱之為:bean物件

思路:

  1. 刪除Controller層、Service層中new物件的程式碼
  2. Service層及Dao層的實現類,交給IOC容器管理
  3. 為Controller及Service注入執行時依賴的物件
    • Controller程式中注入依賴的Service層物件
    • Service程式中注入依賴的Dao層物件

IOC詳解

bean的宣告

註解 說明 位置
@Controller @Component的衍生註解 標註在控制器類上
@Service @Component的衍生註解 標註在業務類上
@Repository @Component的衍生註解 標註在資料訪問類上(由於與mybatis整合,用的少)
@Component 宣告bean的基礎註解 不屬於以上三類時,用此註解

在IOC容器中,每一個Bean都有一個屬於自己的名字,可以透過註解的value屬性指定bean的名字。如果沒有指定,預設為類名首字母小寫。

元件掃描

  • 使用四大註解宣告的bean,要想生效,還需要被元件掃描註解@ComponentScan掃描

@ComponentScan註解雖然沒有顯式配置,但是實際上已經包含在了引導類宣告註解 @SpringBootApplication 中,預設掃描的範圍是SpringBoot啟動類所在包及其子包

手動新增@ComponentScan註解,指定要掃描的包

DI詳解

@Autowired註解,預設是按照型別進行自動裝配的(去IOC容器中找某個型別的物件,然後完成注入操作)

如果在IOC容器中,存在多個相同型別的bean物件,程式會報錯
如何解決上述問題呢?Spring提供了以下幾種解決方案:

  • @Primary

  • @Qualifier

  • @Resource

使用@Primary註解:當存在多個相同型別的Bean注入時,加上@Primary註解,來確定預設的實現。

使用@Qualifier註解:指定當前要注入的bean物件。 在@Qualifier的value屬性中,指定注入的bean的名稱。

  • @Qualifier註解不能單獨使用,必須配合@Autowired使用

使用@Resource註解:是按照bean的名稱進行注入。透過name屬性指定要注入的bean的名稱。

面試題 : @Autowird 與 @Resource的區別

  • @Autowired 是spring框架提供的註解,而@Resource是JDK提供的註解
  • @Autowired 預設是按照型別注入,而@Resource是按照名稱注入

相關文章