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

文章介绍了JavaEE中Spring框架的IoC(控制反转)和DI(依赖注入)概念。通过传统代码与IoC代码的对比,说明了IoC如何降低代码耦合性,以及DI作为IoC的实现方式,使得对象的创建和控制权发生反转,提高了代码的灵活性。
摘要由CSDN通过智能技术生成
JavaEE传送门

JavaEE

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

Servlet —— Servlet API



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吖!!感谢你看到这里🌬
祝今天的你也
开心满怀,笑容常在。
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值