控制反转(IoC)与依赖注

  • **引出spring**
    • 依赖关系
  • spring 容器
    • IOC:控制反转
    • DI:依赖注入
  • 总结

Spring中有3个核心的概念: 控制反转(Ioc)依赖注入(DI)面向切面编程(AOP),spring中其他的技术都是依靠3个核心的技术建立起来的,所以玩spring需要先对这3个概念有个深入的理解。

本文我们先介绍其中的两个:控制反转和依赖注入,而aop我们后面有专门的文章详解。

引出spring

有2个类,A和B,如下:

public class A{public void m1(){}
}public class B{public void m1();//和m1 不一样
}

上面的两个类都有同样的方法m1.

现在我们调用B的m1方法完成一些事情,而B中的m1方法需要调用A中的m1方法才可以完成这个事情,所以B的代码变成了下面这样:


```java
public class B{private A a; // @1public B(){this.a = new A(); //@2}public void m1(){this.a.m1(); //@3}}

分析一下上面代码:

@1:B类中声明了一个A类型的属性a

@2:new了一个A对象,赋给了a属性

@3:B类中的m1方法中去调用a.m1()完成业务操作

依赖关系

先说一下什么是依赖关系?

当a对象完成某些操作需要调用b对象中的方法来实现时,说明a依赖于对象b,a和b是依赖关系。

上面代码中B的m1需要调用A的m1方法,说明了B依赖于A

上面代码存在一些问题问题

B类中a对象的创建被写死在B的构造方法中了,如果我们想在创建不同的B对象的时候,使用不同的a对象,此时是无能为力的;代码也不利于测试,由于B中a的创建被写死在构造方法中了,我们想测试一下B中不同a对象的效果,此时只能去修改B中的构造方法。

不知道什么叫做构造方法如下:
Java构造函数

上面代码需要优化,B中a对象的创建不能写死,可以让外部传入进去,调整一下变成了下面这样:

public class B{private A a;public B(A a){this.a = a;}public void m1(){this.a.m1(); }
}

上面代码可以在创建B对象的时候,将外部创建好的a对象传入进去,此时a的控制权交给了使用者,创建B对象如下:

A a = new A();
B b = new B(a);
b.m1();

上面代码我们再扩展一下,如果B类中还需要依赖很多类似于A的对象,比如需要依赖于C、D、E、F或者更多对象,首先是需要调整B的构造方法,修改老的构造方法不是很好,可以在B中新增一些构造方法。

但是使用B的时候就变成了下面这样:

A a = new A();
C c = new C();
D d = new D();
E e = new E();
F f = new F();
...
B b = new B(a,c,d,e,f,...);
b.m1();

使用者创建B对象之前,需要先将B依赖的对象都给创建好,然后B依赖的这些对象传递给B对象,如果有很多地方都需要用到B类型的对象,都采用这种new的写法,代码量比较大,也不方便维护,如果B中新增了依赖,又需采用new的方式先创建好被依赖的对象,然后将被依赖的对象填充给B对象。

上面创建对象之前,需要先将被依赖对象通过new的方式创建好,然后将其传递给B,这些工作都是B的使用者自己去做的,所有对象的创建都是由使用者自己去控制的,弊端上面也说了,代码量也比较大,代码耦合度比较高(依赖有调整,改动也比较大),也不利于扩展。

大家可以思考一下还有其他 好的解决问题的方法吗?

上面B对象以及B依赖的对象都是使用者自己主动去控制其创建的,能不能找一个第三方来把这个事情给做了,比如给第三方一个清单,清单中告诉第三方我需要用到B对象以及B需要依赖的对象,然后由这个第三方去负责创建和组装B对象,使用者需要使用B对象的时候,只需要向第三方发起一个查找,如果第三方那边有B对象,直接将其内部组装好的B对象返回就可以了,整个系统中所有需要用到的对象都可以列个清单,让第三方帮忙创造,用的时候只需要向第三方索取就可以了,当B中依赖的对象有新增或者删除的时候,只需要去调整一下清单就可以了,这个事情spring已经帮我们实现了。

spring 容器

spring容器的概念,容器这个名字起的相当好,容器可以放很多东西,我们的程序启动的时候会创建spring容器,会给spring容器一个清单,清单中列出了需要创建的对象以及对象依赖关系,spring容器会创建和组装好清单中的对象,然后将这些对象存放在spring容器中,当程序中需要使用的时候,可以到容器中查找获取,然后直接使用。

IOC:控制反转

使用者之前使用B对象的时候都需要自己去创建和组装,而现在这些创建和组装都交给spring容器去给完成了,使用者只需要去spring容器中查找需要使用的对象就可以了;这个过程中B对象的创建和组装过程被反转了,之前是使用者自己主动去控制的,现在交给spring容器去创建和组装了,对象的构建过程被反转了,所以叫做控制反转;IOC是是面相对象编程中的一种设计原则,主要是为了降低系统代码的耦合度,让系统利于维护和扩展。

DI:依赖注入

依赖注入是spring容器中创建对象时给其设置依赖对象的方式,比如给spring一个清单,清单中列出了需要创建B对象以及其他的一些对象(可能包含了B类型中需要依赖对象),此时spring在创建B对象的时候,会看B对象需要依赖于哪些对象,然后去查找一下清单中有没有包含这些被依赖的对象,如果有就去将其创建好,然后将其传递给B对象;可能B需要依赖于很多对象,B创建之前完全不需要知道其他对象是否存在或者其他对象在哪里以及被他们是如何创建,而spring容器会将B依赖对象主动创建好并将其注入到B中去,比如spring容器创建B的时候,发现B需要依赖于A,那么spring容器在清单中找到A的定义并将其创建好之后,注入到B对象中。

总结

1.IOC控制反转,是一种设计理念,将对象创建和组装的主动控制权利交给了spring容器去做,控制的动作被反转了,降低了系统的耦合度,利于系统维护和扩展,主要就是指需要使用的对象的组装控制权被反转了,之前是自己要做的,现在交给spring容器做了。

2.DI依赖注入,表示spring容器中创建对象时给其设置依赖对象的方式,通过某些注入方式可以让系统更灵活,比如自动注入等可以让系统变的很灵活,这个后面的文章会细说。

3.spring容器:主要负责容器中对象的创建、组装、对象查找、对象生命周期的管理等等操作。

4.下一篇开始详细讲解spring的使用了。

大学生 从0开始学Spring第2篇:控制反转(IoC)与依赖注入【从0到精通】相关推荐

  1. java-12:spring MVC - 控制反转IOC,依赖注入DI

    学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...

  2. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

    目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...

  3. Spring的IOC(控制反转)与DI(依赖注入)

    Spring控制反转与依赖注入 文章目录 Spring控制反转与依赖注入 1. 控制反转(IOC) 2. 依赖注入(DI) 3. 总结 1. 控制反转(IOC) 控制反转(Inversion of C ...

  4. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

  5. 三大框架之spring框架+IoC控制反转、DI依赖注入

    三大框架:业务层框架Spring+IoC+DI 往期文章:jsp与cookie.重定向与RESTFul架构支持 下一章节: 持久层框架MyBatis 初识Spring框架 MyBatis 入门http ...

  6. 详解spring的IOC控制反转和DI依赖注入

    转载 详解spring的IOC控制反转和DI依赖注入 2018-06-05 15:45:34 jiuqijack 阅读数 2945 文章标签: spring IOC控制反转 DI依赖注入 更多 分类专 ...

  7. Spring中的IoC(控制反转)和DI(依赖注入)

    一.Spring IoC的基本概念 控制反转(IoC) 是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) 是IoC的另外一种说法,只是从不同的角度 ...

  8. (八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

    文章目录 前言 Spring Spring IOC 简介 Bean IOC 概述 IOC 本质理解 Spring IOC 应用 IOC xml装配 IOC 依赖注入 IOC Bean的作用域 IoC ...

  9. Spring-初识Spring框架-IOC控制反转(DI依赖注入)

    ---恢复内容开始--- IOC :控制反转 (DI:依赖注入) 使用ioc模式开发 实体类必须有无参构造方法 1.搭建Spring环境 下载jar http://maven.springframew ...

最新文章

  1. java auth fail_com.jcraft.jsch.JSchException: Auth fail
  2. bzoj2440: [中山市选2011]完全平方数
  3. 判断正则 shell_【US分享】Shell中的括号
  4. php ahp和jhp,php7.4编译(centos)
  5. windows update更新失败 安全模式进不去
  6. c语言数组指定位置插入和删除_玩转C语言链表,单链表/双向链表的建立/遍历/插入/删除...
  7. CYYMysql 源码解读 1
  8. visualstudio学习
  9. 测试-- 自动化测试selenium(关于API)
  10. SQL Server 进程无法连接到 Subscriber “xxxxxx”
  11. imx6 Android gpu 内存,IMX8M / IMX8M NANO /IMX6D 等GPU的简单对比
  12. 日常bug记录——mybatis传值为null
  13. 怎么看计算机硬件配置情况,怎么样查看电脑配置?5种方法查看电脑硬件配置好坏图文详解...
  14. Linux学习-40-格式化分区mkfs、mke2fs命令用法
  15. Webrtc 实现Android群控实时推流
  16. 小白怎么运营抖音,制作出漂亮的视频,成为抖音大V
  17. 常见的信号平滑处理方法
  18. 利用turtle库绘制五角星
  19. 高考在即,京准GPS北斗卫星授时系统(子母钟)助力标准化考场
  20. 阿里云的服务器,安装安骑士的时候总是提示失败

热门文章

  1. epub直接获取书名及书封面
  2. 基于FPGA的LSTM加速器设计(MNIST数据集为例)
  3. KVM管理虚拟机:常用命令
  4. MySQL之父开发的 MariaDB 数据库,扩展了新功能……
  5. apache kafka技术分享系列(目录索引)
  6. 行测-言语理解选词填空必备词语汇总
  7. 十大不良习惯让你衰老速度加快
  8. 买天文望远镜必看——已知望远镜焦距、相机画幅,求视场(附代码,实时更新)
  9. 25个最适合Crossfit的WordPress主题(2020)
  10. 谈谈UCloud保障数据安全的七种“武器”