当前位置: 首页 > article >正文

Spring —— 初学 Spring, 理解控制反转

JavaEE传送门

JavaEE

Servlet —— Smart Tomcat,以及一些访问出错可能的原因

Servlet —— Servlet API


目录

  • Spring
    • IoC (理解控制反转)
      • 传统代码
      • ioc代码
    • DI


Spring

Spring 通常指的是 Spring Farmework (Spring 框架), 它是一个开源框架

用一句话来概括: Spring 是一个包含了众多工具方法的 Ioc 容器.

容器: 就是用来容纳某种物品的装置.

  • List /Map 是数据存储容器

  • Tomcat 是 web 容器

IoC: Inversion of Control (控制反转). 也就是说 Spring 是一个 “控制反转” 的容器.

Spring 是一个 IoC (控制反转) 容器, 他具备两个最基础的功能:

  1. 将对象存到容器(Spring) 中
  2. 从容器(Spring) 中取出对象

IoC (理解控制反转)

IoC: Inversion of Control (控制反转).

假如我们要构造一只 “” 的程序, 我们的思路是这样的:

传统代码

# Bird.java

package old;

public class Bird {
    private Feather feather;

    public Bird() {
        feather = new Feather();
    }

    public void init() {
        System.out.println("执行了 bird init() 方法");
        // 依赖羽毛
        feather.init();
    }
}

# Feather.java

public class Feather {
    private Body body;

    public Feather() {
        body = new Body();
    }

    public void init() {
        System.out.println("执行了 feather init() 方法");
        // 依赖身体
        body.init();
    }
}

# Body.java

package old;

public class Body {
    private Claws claws;

    public Body() {
        claws = new Claws();
    }

    public void init() {
        System.out.println("执行了 body init() 方法");
        // 依赖爪子
        claws.init();
    }
}

# Claws.java

package old;

public class Claws {
    public void init() {
        System.out.println("执行了 claws init() 方法");
    }
}

# 测试代码

package old;

public class App {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.init();
    }
}

# 运行结果展示

# 此时如果我们想给爪子加一个颜色属性 , 我们更改了 Claws.java 中的代码, Body.java 中的代码也会报错. 我们就需要修改 Body.java , 然后更改 Feather.java…

我们可以看到, 传统代码, 存在耦合性问题.


ioc代码

# Bird.java

package ioc;

public class Bird {
    private Feather feather;

    public Bird(Feather feather) {
        this.feather = feather;
    }

    public void init() {
        System.out.println("执行了 bird init() 方法");
        // 依赖羽毛
        feather.init();
    }
}

# Feather.java

package ioc;

public class Feather {
    private Body body;

    public Feather(Body body) {
        this.body = body;
    }

    public void init() {
        System.out.println("执行了 feather init() 方法");
        // 依赖身体
        body.init();
    }
}

# Body.java

package ioc;

public class Body {
    private Claws claws;

    public Body(Claws claws) {
        this.claws = claws;
    }

    public void init() {
        System.out.println("执行了 body init() 方法");
        // 依赖爪子
        claws.init();
    }
}

# Claws.java

package ioc;

public class Claws {
    
    public Claws() {
    }
    
    public void init() {
        System.out.println("执行了 claws init() 方法");
    }
}

# 测试代码

package ioc;

public class App {
    public static void main(String[] args) {
        Claws claws = new Claws();
        Body body = new Body(claws);
        Feather feather = new Feather(body);
        Bird bird = new Bird(feather);
        bird.init();
    }
}

# 运行结果展示

# 此时如果我们想给爪子加一个颜色属性 , 我们只需更改 Claws.java 中的代码

package ioc;

public class Claws {
    private String color;

    public Claws(String color) {
        this.color = color;
    }
    public void init() {
        System.out.println("执行了 claws init() 方法, color : " + color);
    }
}

之后在测试代码中传入参数.

就可以成功添加属性. 降低了代码的耦合性.

对比

传统代码中对象的创建顺序是: Bird -> Feather -> Body -> Claws

控制反转之后对象的创建顺序是: Claws -> Body -> Feather -> Bird

下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。


DI

DI : Denpendency Injection 的缩写, 翻译过来是 “依赖注入” 的意思. 在程序运行期间, 动态的将某个对象引入到当前的 行为机制.

IoC 和 DI 的关系

  • 从广义上来说:

    IoC = DI , 是从不同的维度来描述同一个问题.

  • 从严格意义上来讲:

    IoC 是一种设计思想, 最终还是要有可行的方案.

    DI 是具体的实现技术.


🌷(( ◞•̀д•́)◞⚔◟(•̀д•́◟ ))🌷

以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!
在这里插入图片描述
在这里插入图片描述

这里是Gujiu吖!!感谢你看到这里🌬
祝今天的你也
开心满怀,笑容常在。

http://www.kler.cn/a/227.html

相关文章:

  • 一条sql执行很慢可能的原因,如何优化
  • 计算机网络概述
  • 使用Maven实现第一个Servlet程序
  • Python打包成exe,文件太大问题解决办法(比保姆级还保姆级)
  • 【无标题】
  • 【CSS】SVG实战入门,svg画曲线,svg简单动画上手入门
  • 【C++笔试强训】第三十一天
  • 改进YOLO系列 | CVPR2023最新Backbone | FasterNet 远超 ShuffleNet、MobileNet、MobileViT 等模型
  • MySQL数据库的基础语法总结(1)
  • 【2022-09-14】米哈游秋招笔试三道编程题
  • Web API之鼠标事件
  • 2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒
  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断
  • echarts有滑块
  • 【24】Verilog进阶 - 序列检测2
  • 蓝桥杯刷题第九天
  • 基于stm32智能语音电梯消毒系统
  • FPGA和IC设计怎么选?哪个发展更好?
  • Python+ChatGPT实战之进行游戏运营数据分析
  • 如果你持续大量的教坏ChatGPT,它确实会变坏