面试: SpringIOC你怎么理解的?

考点:spring ioc概念,设计思想,底层原理。

1、什么是IOC?

IOC——Inversion of Control,又称控制反转,一种设计思想,把对象创建和对象之间的调用过程,交给 Spring 进行管理,而不是传统的在你的对象内部直接控制。要想理解清晰IOC就要明确“谁控制谁?控制是什么?反转是什么?那些反转了?”

●谁控制谁?控制什么?:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;所以IoC 容器控制了对象;主要控制了外部资源获取(不只是对象包括比如文件等)。
●反转是什么?那些反转了?:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

2、IOC 底层原理

在这里插入图片描述
在这里插入图片描述

ioc使用xml解析 + 工厂模式 + 反射减低耦合度

画图讲解 IOC 底层原理,(ioc模式可以使得耦合度进一步降到最低)
在这里插入图片描述

3、IOC的作用?

传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
其中最大的改变是实现了思想上的“主从换位”,IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

4、IoC和DI

DI—Dependency Injection,又称依赖注入,组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中,提高了组件的重用的频率,使得系统变得更灵活,更易扩展。通过依赖注入机制,我没可以只用通过简单的配置就可以指定目标需要的资源完成自身的业务逻辑,而不需要关注具体的资源来处?由谁实现。理解DI的关键是:“谁依赖谁?为什么需要依赖?谁注入谁?注入了什么?”

●谁依赖于谁:当然是某个容器管理对象依赖于IoC容器;“被注入对象的对象”依赖于“依赖对象”;
●为什么需要依赖:容器管理对象需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入某个对象,也就是注入“依赖对象”;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

5、Spring容器的设计

以上都提到一个重要的东西,那便是容器,那么容器又是什么?

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂,容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。
2、Spring 提供 IOC 容器实现两种方式:(两个接口)

(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用,加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象, BeanFactory可以理解为就HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用,加载配置文件时候就会把在配置文件对象进行创建,该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 Bean。
扩展:因为要部署到服务器上给用户用,所以用饿汉式的ApplicationContext会更好一些,将这些耗时的工作在启动项目前就搞定,有利于提高用户体验,饿汉式即一加载就配置。

3、ApplicationContext 接口有实现类
在这里插入图片描述
注意:FileSystemXmlApplicationContext代表可以将带盘符的路径传进来解析,ClassPathXmlApplicationContext则代表可以将src目录下的的文件可以扫描.

扩展:

一般问到这个问题面试官可能会接着问IoC的初始化过程或者DI的注入过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值