IOC(控制反转)

目录

理解IOC

理解IOC容器

Spring IOC

IOC优点

什么是依赖注入DI

DI是如何实现的呢?

总结 :

IOC实现的基本过程

容器如何放入Bean对象?

IOC实现的基本过程

IoC容器在Spring的实现


理解IOC

IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序

  • 谁控制谁 ,控制什么 :

传统设计 : 直接在对象内部通过new 进行创建对象,程序主动依赖创建的对象.

IOC : 由IOC容器来控制对象的创建

谁控制谁 : IOC容器控制了对象

控制什么? 主要控制了外部资源获取(不只是对象也包括文件).

  • 为什么是反转,哪些方面反转

正转 : 传统应用程序由我们主动控制去直接获取依赖对象

反转 : 由容器来创建及注入依赖的对象

为什么是反转 ? 容器帮我们查找及注入依赖的对象,对象只是被动地接受依赖对象.

哪些方面反转了 ? 依赖对象的获取被反转了.

理解IOC容器

对于上面APP这个类就相当于是一个IOC容器

这个容器可以自动的对你的代码进行初始化,你只需要维护一个Configuration(可以是一个XML,可以使一段代码),不用每次初始化一辆车都要亲自去写一大堆初始化的代码 ,--->进行管理Java Bean从创建到销毁的过程

Spring IOC

Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。

IoC 容器是 Spring 框架中最重要的核心组件之一,它贯穿了 Spring 从诞生到成长的整个过程

  • 控制反转是一种思想。
  • 控制反转是为了降低程序耦合度,提高程序扩展力。
  • 控制反转,反转的是什么?
    • 将对象的创建权利交出去,交给第三方容器负责。
    • 将对象和对象之间关系的维护权交出去,交给第三方容器负责。
  • 控制反转这种思想如何实现呢?
    • DI(Dependency Injection):依赖注入

对于 Spring IOC 而言呢.以前是需要在对象的内部自己去创建,而IOC是交给spring去创建,也就是说所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转.

IOC优点

传统应用程序都是由我们在类的内部主动创建依赖对象,从而导致类与类之间的高耦合.

IOC容器,把创建和查找依赖对象的控制权都交给了容器,由容器来注入组合对象,对象与对象之间耦合度降低. 方便测试,功能复用,使得整个体系结构变得非常灵活.

就比如 :

传统 : 应用程序是老大,想获取什么资源都是主动出击.

IOC :应用程序变为被动,被动地等待IOC容器来创建并注入它所需要的资源了.而不是对象主动去创建依赖的资源,

节省系统资源和提高程序的性能,spring IOC 是单例的,spring IOC采用的是懒汉模式,第一次调用这个类的时候我才去加载和初始化,就永远放在内存中,当其他类以后第2,3,....次用这个类的时候,不需要从新去进行类加载了,可以直接使用这个类,就不会有多个对象,不需要在用的时候再去new了.

什么是依赖注入DI

所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中

依赖注入 就是在程序运行的时候由IOC容器动态的将我所依赖的对象加入到当前类中的过程

  • 谁依赖于谁 : 应用程序依赖于IOC容器
  • 为什么需要依赖 : 应用程序需要IOC容器来提供对象所需要的外部资源
  • 谁注入谁 : IOC容器注入应用程序依赖的对象
  • 注入了什么 : 注入某个对象所依赖的外部资源(包括对象,资源,常量数据...)

就比如A对象要操作数据库,就需要一个Connection对象,有了spring就会告诉spring,我需要connection对象,至于这个connection资源怎么进行构造,什么时候构造,A不需要进行关心,在程序运行的时候,spring就会制造一个connection,然后向打针一样,注射到A当中. 完成了各个对象之间的控制.

Connection由spring注入到A当中的,所以为依赖注入

通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

DI是如何实现的呢?

Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

总结 :

依赖注入:

  • 依赖注入 就是在程序运行的时候由IOC容器动态的将我所依赖的对象加入到当前类中的过程

依赖注入常见的实现方式包括三种:

  • 第一种:属性注入
  • 第二种:set注入
  • 第二种:构造注入

所以结论是:IOC 就是一种控制反转的思想, 而 DI 是对IoC的一种具体实现。

Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值/属性的注入过程(或者叫做Bean对象之间关系的维护)

IOC实现的基本过程

容器如何放入Bean对象?

通过一个Map集合来放入JavaBean.

为什么使用Map集合 : 最重要的是因为它是以key-val键值对进行存储的.

IOC实现的基本过程

  • 首先我们通过XML配置/注解的方式,告诉IOC我们要创建什么样的对象让IOC给我创建并且返回,接着就会通过一个抽象/接口BeanDefinitionReader进行加载,这个接口有不同的实现类,根据不同的方式进行不同的加载,把加载好的Bean的定义信息放到IOC容器中,IOC先对Bean的定义信息(这个Bean的定义信息还可以进行修改)进行实例化,在Spring中是通过BeanFactory+反射的方式进行实例化,然后在对 对象进行初始化,得到最终的对象.我们可以通过context.getBean()方法去得到IOC容器中的对象.

  1. 将对象的创建权利交出去,交给第三方容器负责。
  2. 将对象和对象之间关系的维护权交出去,交给第三方容器负责。

IoC容器在Spring的实现

IOC具体在Spring中的实现是通过BeanFactory工厂这个接口

BeanFactory是IOC的最基本实现

①BeanFactory

这是 IoC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

②ApplicationContext

我们要用的是BeanFactory的子接口也就是 ApplicationContext

BeanFactory 的子接口,提供了更多高级特性,有不同的实现类。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。

这个ApplicationContext接口有更高级更强大的功能

类型名

简介

ClassPathXmlApplicationContext

通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象

FileSystemXmlApplicationContext

通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象

ConfigurableApplicationContext

ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。

WebApplicationContext

专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

参考 :

尚硅谷视频

关于IOC的一些博客

控制反转_百度百科

IOC 控制反转[通俗易懂]-腾讯云开发者社区-腾讯云

Spring系列第2篇:控制反转(IoC)与依赖注入(DI) - 知乎

浅析控制反转 - 知乎

浅谈控制反转与依赖注入 - 知乎

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值