1. 程式人生 > >3. Spring: 深入理解IoC

3. Spring: 深入理解IoC

3. Spring: 深入理解IoC

IoC 是 Spring容器的核心,AOP、宣告式事務等功能都依賴於此功能

  1. 解耦過程例項

    • 問題場景

      在這裡插入圖片描述

    • 解耦過程

      在這裡插入圖片描述

    • IoC解耦

      • 介面具體實現類的控制權從呼叫類移除,轉交到第三方決定

        例如場景中:

        • 控制:選擇劉建明角色扮演者的控制權
        • 反轉:控制權從劇本中移除,轉交到了導演手中

        3.3

  2. IoC注入

    • 建構函式注入

      通過呼叫類的建構函式,將介面實現通過建構函式變數傳入

      在這裡插入圖片描述

    • 屬性注入

      (用到的時候才注入,比建構函式注入節約)

      在這裡插入圖片描述

    • 介面注入

      (增加類的數量,和屬性注入本質區別不大,所以不提倡)

      在這裡插入圖片描述

    • Spring 配置示例

      在這裡插入圖片描述

  3. Java反射機制

    • ClassLoader

      類裝載器就是尋找類的位元組碼檔案並構造出類在JVM內部表示的物件元件,主要工作由ClassLoader及其子類負責,ClassLoader是一個重要的Java執行時系統元件,它負責在執行時查詢和裝入Class位元組碼檔案。

      • 工作機制

        1. 裝載:查詢和匯入Class檔案
        2. 連結:執行校驗,準備和解析步驟
        3. 初始化:對類的靜態變數,靜態程式碼塊執行初始化工作
      • ClassLoader之間的關係

        public static void main(String[] args) {
                ClassLoader loader=Thread.currentThread().getContextClassLoader();
                System.out.println("current loader: "+loader);
                System.out.println("parent loader: "
        +loader.getParent()); System.out.println("grandparent loader: "+loader.getParent().getParent()); } current loader: sun.misc.Launcher$AppClassLoader@18b4aac2 parent loader: sun.misc.Launcher$ExtClassLoader@5451c3a8 grandparent loader: null (根裝載器,非java編寫,無法顯示出來)
      • 重要方法

        Class loadClass(String name)  //name類裝載器需要裝載的類的名字
        Class defineClass(String name,byte[]b,int off ,int len)//位元組陣列裝換成java.lang.class 物件
        Class findSystemClass(String name)   //從本地檔案系統載入class檔案
        Class findLoadedClass(String name)   //檢視classloader是否已經裝入到某個類中
        ClassLoader getParent()//類裝載器的父裝載器除了根裝載器 其他類裝載器都有且僅有一個父裝載器
        
        
    • 重要的反射類

      • Constructor: 類的建構函式的反射類,獲得類的所有建構函式
      • Method:方法的反射類
        • getReturnType()
        • getParameterType()
        • getExceptionType()
        • getParameterAnnotations()
      • Field:類的成員變數的反射類
    • Java反射與IoC的關係

      在這裡插入圖片描述

  4. 資源訪問工具類

    • JDK所提供的訪問資源類並不能很好的滿足各種底層資源的訪問請求,因此Spring設計了一個Resource介面,它為應用提供了更加強大的訪問底層資源的能力。

      在這裡插入圖片描述

    • 資源載入機制

      在這裡插入圖片描述

    • 資源載入類介面

      在這裡插入圖片描述

  5. BeanFactory和ApplicationContext

    • BeanFactory是一個類工廠,可以建立管理各種類的物件,Spring稱這些建立和管理的Java物件為Bean(Spring 的基礎設施)

      • 初始化順序
        1. 建立配置檔案
        2. 裝載配置檔案
        3. 啟動IoC容器
        4. 獲取Bean示例
    • ApplicationContext由BeanFactory派生而來,提供了更多面向實際應用的功能。

      BeanFactory很多功能需要程式設計實現

      ApplicationContext則可以通過配置的方法來實現