面试: 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

●谁依赖于谁:当然是某个容器管理对象依赖于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的注入过程。

经验分享 程序员 微信小程序 职场和发展