【Spring】一個小故事帶你瞭解 Spring IoC

1. 前言

本文參考 Spring 視頻教程總結而來, 通過 小紅同學 幻想自己是有車一族下班回家,簡單抽象下 IoC 基本概念。

2. 有車一族

小紅下了班,開着自己的 Audi ,左拐一下,右拐一下,就回家了,真是快活。

咱們用代碼來模擬一下:

public class XiaoHong {
	public void goHome() {
		// 有一輛 Audi
		Audi audi = new Audi();
		audi.start(); // 啓動
		audi.turnLeft(); // 左拐一下
		audi.turnRight(); // 右拐一下
		audi.stop(); // 停車
	}
}

那麼,咱們來分析分析,小紅同學回家之路。

1、goHome 中 new Audi() 能表示小紅同學有一輛 Audi 麼?
2、小紅同學,能夠 new Audi() 麼? 一個人能造車麼?
3、回家,是需要 Audi 麼?還是需要 車?
4、如果小紅,換車了,買了輛 Lamborghini ,咱們需要做什麼樣的更改?

3. 程序員來湊湊熱鬧

針對上文討論的 1234,咱們一一來探討探討。

客官請看:

public class XiaoHong {
	private Audi audi; // 表示有一輛 Audi
	// 構造方法傳入,表示 小紅 是有車一族
	public XiaoHong(Audi audi) {
		this.audi = audi;
	}
	public void goHome() {
		audi.start(); // 啓動
		audi.turnLeft(); // 左拐一下
		audi.turnRight(); // 右拐一下
		audi.stop(); // 停車
	}
}

經程序員之手稍加修改, private Audi audi; 即可表明小紅有一輛 Audi, 通過構造函數傳入,表明了小紅的人設就是有車一族(準確的說是有 Audi 車一族)。

那麼,3、4 問題呢?(莫慌莫慌,開發哥哥都是很忙了)

。。。。。。。。。。。 隔了十天半個月 。。。

開發哥哥又出來接活(改造)了。

// Car.java
public interface Car {
	void start();
	void turnLeft();
	void turnRight();
	void stop();
}

// Audi.java
public class Audi implements Car {
	@Override
	public void start(){}
	// 此處省略其他方法
}

// XiaoHong.java
public class XiaoHong {
	private Car car; // 表示有一輛車
	// 構造方法傳入,表示 小紅 是有車一族
	public XiaoHong(Car car) {
		this.car = car;
	}
	public void goHome() {
		car.start(); // 啓動
		car.turnLeft(); // 左拐一下
		car.turnRight(); // 右拐一下
		car.stop(); // 停車
	}
}

通過聲明一個接口 Car 來聲明 車 的行爲,同時,XiaoHong 聲明一個 car 的 feild 表明小紅是有車一族(這裏纔是真正的有車一族)。

在實例化小紅(小紅人設,說白了就是電影開拍了,找了演員了)的時候,傳入 car 即可,這個 car, 不管是 Audi 還是 Lamborghini, 甚至是自行車,小紅都能 goHome

代碼示例:

public void static main(String[] args) {
	// 買車,一輛奧迪
	Car audi = new Audi();
	// 小紅生來就是有車一族(沒辦法,f二代)
	XiaoHong xiaohong = new XiaoHong(audi);
	// 回家
	xiaohong.goHome();
}

那麼,3,4 問題也都解決了,3(需要的是車),4(換車了,就傳入新的 car 的實現類即可)

ok,全劇終。(其實,沒完,中途,小紅換車了,你懂的)

4. what?

what?劇終了?小紅劇照都還沒看到呢?

好吧,博主妥協了,決定,給你們談談小紅的。。。春。。。。。哦不。。。。Spring 。。。。。

聽過 Spring 的人,應該都知道,IoC。

IoC 意爲控制反轉?那麼問題來了,控制什麼?什麼是反轉?

  • 控制: 對 Java Bean 對象的生命週期的控制(小紅 這個人設在電影的生老病死)
  • 反轉: 把 控制權 從 使用者(調用者)的反轉交給 Spring Bean 容器來管理

回想一下。最開始的時候,小紅自己管理 Audi 的創建,銷燬(當然,Java 交給了 GC)。 用代碼來表示是這樣的:

public class XiaoHong {
	public void goHome() {
		// 有一輛 Audi
		Audi audi = new Audi();
		// 省略其他代碼
	}
}

然後,咱們把對象的創建、銷燬(控制權)交給 Spring Bean 容器管理【控制反轉】。同時,咱們抽象了下,把 Audi 抽象爲 Car,用代碼表示是這樣的:

public class XiaoHong {
	private Car car; // 表示有一輛車
	// 構造方法傳入,表示 小紅 是有車一族 【這裏採用的是構造器注入,Spring 還提供了其他方式,這裏僅作示例】
	public XiaoHong(Car car) {
		this.car = car;
	}
	// 省略其他代碼
}

什麼叫做交給 Spring Bean 容器管理呢? Car 這個類,不是由小紅來創建的,而是 Spring 創建扔 bean 容器中,實例化小紅(小紅用車)的時候,就直接從 bean 容器獲取即可。

四不四,一下子就明白了 Spring IoC 控制反轉 的意思了哇?很清晰,很明白對不對?

沒有明白?好吧,那請移步 ~ _ ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章