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 控制反轉 的意思了哇?很清晰,很明白對不對?
沒有明白?好吧,那請移步 ~ _ ~