天天看點

Spring IOC學習Spring IOC學習

Spring IOC學習

文章目錄

  • Spring IOC學習
    • 什麼是Spring IOC
      • IOC和DI有什麼差別
      • 控制反轉的實作類型
    • Spring IOC解決了什麼問題
    • 示例代碼
    • Bean的配置方式
    • Spring依賴注入方式
    • 控制Bean的生命周期行為方式
    • 總結
    • 參考資料

什麼是Spring IOC

IOC(控制反轉)是指IOC容器,在Spring中通過IOC容器來管理所有的Bean及它們互相依賴的關系,負責Bean的生命周期的控制等

IOC和DI有什麼差別

IOC和DI(依賴注入)是一種事物的兩種不同說法,在《Spring5開發大全》書上介紹,DI是IOC的一種特殊實作,一般認為它們是相同的。

控制反轉的實作類型

  • 依賴注入(DI),Spring使用的方式
  • 依賴查找(DL)

Spring IOC解決了什麼問題

IOC的作用就是把依賴從類内部轉移到類外部以降低子產品間的耦合度。類A需要依賴類B的Bean,這時候類A會跟IOC容器說要申請一個類型為B的Bean對象,IOC會根據中繼資料(Bean配置)來自動建立一個Bean給類A,而不是通過類A來New一個類B,這樣就降低了子產品之間的耦合度。在程式内部多個子產品依賴類B的Bean對象,如果IOC容器已經建立的話會直接傳回,否則建立一個類B的Bean再傳回(這是Spring IOC的預設政策,單例,如果需要每次都建立新的Bean對象可以更改政策)

示例代碼

示例示範了Spring程式從xml配置檔案讀取中繼資料建立Bean對象,并拿到這個Bean對象調用方法輸出。

xml配置了一個構造函數注入的執行個體,傳入一個name為jack的參數給Bean對象

20190728.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       <!--scope屬性預設是 singleton,單例,整個程式中隻執行個體化一次,需要每次都執行個體化一個時選擇 prototype,或者其他的參數-->
    <bean id="testpojo" class="com.ccccye.springstudy.S20190728.TestPojo" scope="singleton">
        <constructor-arg name="name" value="jack"  />
    </bean>
</beans>

           

TestPojo.Java

package com.ccccye.springstudy.S20190728;

/**
 * Created by ccccye on 2019/7/28
 */
public class TestPojo {

    private String name;

    public TestPojo(String name) {
        this.name = name;
    }

    public void Hello(){
        String msg = String.format("Hi,%s", this.name);
        System.out.println(msg);
    }

    public void say(){
        System.out.println("Bean已經建立好可以使用了");
    }
}
           

TestAPP.Java

package com.ccccye.springstudy.S20190728;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by ccccye on 2019/7/28
 */
@SpringBootApplication
public class TestAPP {
    public static void main(String[] args) {
        SpringApplication.run(TestAPP.class, args);

        // 根據xml配置檔案建立bean
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"20190728.xml"});

        // 檢索bean執行個體
        TestPojo test = context.getBean("testpojo", TestPojo.class);

        // 調用bean執行個體方法
        test.say();
        test.Hello();
    }
}

           

具體的實作項目可以到我的GitHub下載下傳

Bean的配置方式

  • xml,這是最初的配置方式
  • Java Config,用Java類來配置
  • 注解,在類、方法上面使用特定的注解

Spring依賴注入方式

  • 基于構造函數
  • 基于setter方法

控制Bean的生命周期行為方式

  • 實作InitializingBean和DisposableBean回調接口
  • 自定義init()和destroy的方法(xml配置)
  • 使用@PostConstruct和@PreDestroy注解

    也可以使用結合一起使用,但是需要注意執行順序,,

總結

使用IOC容器可以降低子產品間的耦合度,讓不同的開發人員隻關注自己負責的子產品,同時IOC容器也是Spring的核心貫穿于整個架構,是學習Spring必須掌握的知識點

參考資料

  • 《Spring5開發大全》