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開發大全》