【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 控制反转 的意思了哇?很清晰,很明白对不对?

没有明白?好吧,那请移步 ~ _ ~

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