[豪の学习笔记] Spring框架学习碎碎念#2
Spring IoC
学习文献:
- [Martin Fowler] https://martinfowler.com/articles/injection.html
- [zhouyunjian] https://blog.csdn.net/zhouyunjian/article/details/107304786
- [JavaGuide] https://javaguide.cn/system-design/framework/spring/ioc-and-aop.html
- [Spring Cloud] https://www.springcloud.io/post/2022-01/springboot-aop/
- [Spring Framework] https://docs.spring.io/spring-framework/reference/core/aop/proxying.html
IoC概念
IoC,Inversion of Control,即控制反转,控制指的是对象创建(实例化、管理)的权利,反转指的是控制权交给外部环境(IoC容器)。它是一种思想而非技术实现,描述的是Java开发领域对象的创建及管理的问题
可以理解为类与类之间的依赖通过容器来控制、配置实现;原来类与类之间在编译时即产生了依赖,即new对象时已建立好两者之间的依赖关系,而IoC机制将两者之间的依赖关系通过容器进行控制,通过注解的方式在运行时阶段,动态地将某种依赖注入到类中
例如:现有类A依赖于类B
- 传统的开发方式:在类A中手动通过new关键字来new一个B的对象出来
- 使用Ioc思想的开发方式:不通过new关键字来创建对象,而是通过IoC容器(Spring框架)来实例化对象,需要哪个对象则直接可以在IoC容器内取用
IoC原理
主要是通过反射原理实现,设计流程如下:

根据路径、资源名称等方式,将xml文件、注解类加载到容器中
通过BeanDefinitionReader将对象解析成BeanDefinition实例
创建BeanFactory工厂(注册前后需要添加bean前置、后置处理器)
通过BeanFactory工厂将对象实例化、对象初始化(初始化前后执行前置、后置处理器)
IoC解决了什么问题
IoC的思想就是两方之间不相互依赖,由第三方容器来管理相关资源
- 对象之间的耦合度/依赖程度降低
- 资源变得更容易管理
例如:现有一个针对User的操作,利用Service和Dao两层结构进行开发
- 在没有使用IoC思想的情况下,Servcie层想要使用Dao层的具体实现的话,需要通过new关键字在UserServiceImpl中手动new出IUserDao的具体实现类UserDaoImpl
但若开发过程中突然接到新需求,针对IUserDao接口开发出另一个具体实现类,因为Service层依赖了IUserDao的具体实现,所以我们需要修改UserServcieImpl中new的对象。如果有很多地方都引用了IUserDao的具体实现,一旦需要更换IUserDao的实现方式,修改起来会非常麻烦
- 使用IoC的思想,我们将对象的控制权(创建、管理)交给IoC容器去管理,在使用时直接向IoC容器调用即可
IoC与DI有区别吗
IoC是一种设计思想/模式,它将原本在程序中手动创建对象的权力交给第三方,如IoC容器。对于我们常用的Spring框架来说,IoC容器实际上就是个Map(key, value),Map中存放的是各种对象。不过IoC在其他语言中也有应用,并非Spring特有
IoC最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,DI)

浙公网安备 33010602011771号