写点什么

一个小故事带你了解 Spring IoC

作者:lambochen
  • 2023-01-28
    浙江
  • 本文字数:1907 字

    阅读完需:约 6 分钟

博客搬家,原 blog:https://blog.csdn.net/chensanwa/article/details/105303915

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.javapublic interface Car {  void start();  void turnLeft();  void turnRight();  void stop();}
// Audi.javapublic class Audi implements Car { @Override public void start(){} // 此处省略其他方法}
// XiaoHong.javapublic 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 控制反转 的意思了哇?很清晰,很明白对不对?


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


发布于: 刚刚阅读数: 7
用户头像

lambochen

关注

Stay hungry, stay foolish. 2019-02-28 加入

还未添加个人简介

评论

发布
暂无评论
一个小故事带你了解 Spring IoC_lambochen_InfoQ写作社区