目录
理解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容器中的对象.
- 将对象的创建权利交出去,交给第三方容器负责。
- 将对象和对象之间关系的维护权交出去,交给第三方容器负责。
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) - 知乎
浅析控制反转 - 知乎
浅谈控制反转与依赖注入 - 知乎