Spring 的基本概念和 IoC 特性

目录

1.spring 是什么

1.1 什么是容器

1.2 什么是 IoC

1.3 spring 的基本功能

1.4 详说 DI


1.spring 是什么

我们常说的 Spring 指的是 Spring Framework, 它是一个开源框架, 不但有着活跃⽽庞⼤的社区, 而且应用场景非常广泛. 使用它可以简化 Java 企业级的应⽤程序开发. 如果用一句话概括, 那么 Spring 就是一个包含众多工具方法的 IoC 容器.

1.1 什么是容器

百度百科将容器定义为⽤来容纳某种物品的(基本)装置. 就像我们之前用来运行 Web 项目的 Tomcat, 它就被称之为是一个 Web 容器, 它里面可以容纳存储t的物品就是 Servlet 项目, 这些项目也可以称为组件. 像我们学的各种数据结构, 例如 map 和 list 等, 也可以被称为容器, 它里面存储的物品就是各种类型的数据.

1.2 什么是 IoC

IoC 全称 Inversion of Control. 即控制权的反转. 这个概念是相对于传统开发模式来说的.

我们知道大部分对象和对象之间是存在着依赖和耦合的, 例如 DemoA 对象的 methodA 方法中需要去调用 DemoB 对象的 methodB 方法, 此时我们可以在 methodA 中去 new 一个 DemoB 对象, 使用该对象完成 methodB 方法的调用. 如下所示:

public class DemoA {
    public void methodA(){
        DemoB demoB = new DemoB();
        demoB.methodB();
    }
}

这样写不太好, 因为我们每次调用 methodA 的时候都会新创建一个 DemoB 对象, 而方法调用结束返回的时候, 该对象就会被回收, 显然这是非常浪费系统资源, 所有更推荐下面这种写法, 也就是将 DemoB 对象提取出来作为 DemoA 对象的一个属性, 这样每次调用 methodA 方法的时候使用的都是同一个对象, 避免的频繁创建和销毁对象从而节约了系统资源.

public class DemoA {
    public DemoB demoB;
    
    public DemoA(){
        demoB = new DemoB();
    }
    
    public void methodA(){
        demoB.methodB();
    }
}  

此时 DemoA 对象和 DemoB 对象之间就存在着强耦合, DemoB 对象也称之为 DemoA 的依赖对象, 只有我们先实例化出 DemoB 对象赋值给 demoB 这个属性后, DemoA 对象才能被构造出来. 换句话说 DemoB 对象的生命周期是由 DemoA 对象控制的. 这势必会带来的问题就是, 将来 DemoB 对象的构造方法如果发生变化, 那我们 DemoA 的代码也得跟着调整, 这显然是很难受的.

为了松耦合, 我们在 DemoA 中就不能去控制所依赖对象的生命周期, 而是将其交给第三方来控制, 这个第三方就是我们常说的 spring 容器, 由它来创建和管理这些对象, 然后再由 spring 将我们所依赖的对象注入进来.

public class DemoA {
    public DemoB demoB;
    
    public DemoA(DemoB demoB){
        this.demoB = demoB;
    }
    j
    public void methodA(){
        demoB.methodB();
    }
}

针对上诉的代码, 只要我们能够将 DemoB 对象注册到 spring 容器中去, 并在构造方法上添加上 @Autowired 这个注解, 就可以实现依赖的动态注入. 即我们在实例化 DemoA 对象的时候会自动从 spring 容器中将依赖的 DemoB 对象取出来并注入到构造方法中, 从而完成对象的创建. 这个时候就实现了解耦, 耦合就不在我们自己的逻辑里了, 我们只接收和使用了一个 DemoB 对象, 这个对象是如何创建和销毁的都不需要我们关心了, 将来即使 DemoB 对象的构造方法等发生了调整, 影响的也只会是 spring, 而我们的代码是不需要调整的.

1.3 spring 的基本功能

spring 作为一个 IoC 容器, 要具备的两个基本功能就是:

  • 将对象存储到容器中

  • 从容器中取出对象进行使用

具体来说我们可以将一些类注册到 spring 中去, spring 会根据配置数据, 创建出这些类的实例对象放到容器中进行统一管理. 然后我们就可以从 spring 容器中动态获取对象注入到相关类中.

1.4 详说 DI

DI 是 Dependency Injection 的缩写, 它描述的是在容器运行过程过, 动态地将某种依赖关系注⼊到对象之中. 个人倾向于将依赖注⼊(DI)和控制反转(IoC)画上等号, 它们是从不同的⻆度来描述的同⼀件事情.

当我们在谈到 IoC 这种思想的时候, 我们说 IoC 就是自己不控制依赖对象的创建, 而是把这部分工作交给 spring 来做, 但这还没完, 因为在我们当前的类里面还是需要用到这个依赖对象的, 这必然还会涉及一个主动的从 spring 容器中获得对象并且注入到当前类的过程.

同样当我们谈到 DI 这个概念的时候, 我们说 DI 就是动态地将某种依赖关系注⼊到对象之中, 但在这之前, 势必会有一个控制权转换的过程, 因为如果没有这个过程, 就如我们最开始写的案例, 在 DemoA 中自己就实例化了所依赖的对象, 那也就不需要依赖注入了.

综上所述, IoC 和 DI 其实都在描述一个事情, 就是将控制权交出去交给容器, 再由容器动态的将依赖注入到类中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值