spring ioc面试题都有哪些?应该怎么理解?

TheDisguiser 2020-07-08 22:48:00 java常见问答 5692

以java方向来说,相信面试过的小伙伴都有过体会,在java程序员的面试中spring几乎是必问的。这次我们就来看看有哪些常见的Spring ioc面试题,希望对你们有所帮助。

一、ioc是什么?

“控制反转(IoC)”也称为“依赖注入(DI)”,是一个定义对象依赖的过程,对象只和 构造参数,工厂方法参数,对象实例属性或工厂方法返回相关。容器在创建这些 bean 的时 候注入这些依赖。这个过程是一个反向的过程,所以命名为依赖反转,对象实例的创建由其 提供的构造方法或服务定位机制来实现。

二、spring ioc 体系结构是?

1)、BeanFactory

2)、BeanDefinition

三、ioc容器依赖注入?

1、依赖注入发生的时间

当Spring IoC容器完成了Bean定义资源的定位、载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况发生:

1)、用户第一次通过getBean方法向IoC容索要Bean时,IoC容器触发依赖注入。

2)、当用户在Bean定义资源中为元素配置了lazy-init属性,即让容器在解析注册Bean定义时进行预实例化,触发依赖注入。

BeanFactory接口定义了Spring IoC容器的基本功能规范,是Spring IoC容器所应遵守的最底层和最基本的编程规范。BeanFactory接口中定义了几个getBean方法,就是用户向IoC容器索取管理的Bean的方法,我们通过分析其子类的具体实现,理解Spring IoC容器在用户索取Bean时如何完成依赖注入。

2、AbstractBeanFactory通过getBean向IoC容器获取被管理的Bean

3、AbstractAutowireCapableBeanFactory类实现了ObejctFactory接口,创建容器指定的Bean实例对象,同时还对创建的Bean实例对象进行初始化处理

4、createBeanInstance方法创建Bean的java实例对象

5、SimpleInstantiationStrategy类使用默认的无参构造方法创建Bean实例化对象

6、populateBean方法对Bean属性的依赖注入

7、BeanDefinitionValueResolver解析属性值

8、BeanWrapperImpl对Bean属性的依赖注入

四、ioc 底层原理是?

IoC 容器:主要是完成了完成对象的创建和依赖的管理注入等等。

首先,从我们自己设计这样一个视角来考虑:

其实所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。

对象和对象关系怎么表示?

可以用 xml , properties 文件等语义化配置文件表示。

描述对象关系的文件存放在哪里?

可能是 classpath , filesystem ,或者是 URL 网络资源, servletContext 等。

有了配置文件,就需要对配置文件解析。

不同的配置文件对对象的描述不一样,如标准的,自定义声明式的,如何统一? 在内部需要有一个统一的关于对象的定义,所有外部的描述都必须转化成统一的描述定义。

如何对不同的配置文件进行解析?需要对不同的配置文件语法,采用不同的解析器

五、Spring ioc优缺点有哪些?

优点:

因为ioc会把对象生成都放在XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨)。

缺点:

1)、生成对象的步骤变复杂了,对于不习惯的开发者,会觉得十分别扭和复杂。

2)、因为对象生成是使用反射编程实现的,所以在在效率上损耗会有点小高。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。

3)、缺少对IDE重构操作的支持,如果你想要在Eclipse要对类改名,就需要去XML文件里手工改变。

以上就是今天关于Spring的全部内容了,看完本篇文章,如果小伙伴们对面试又多了几份把握,还想了解更多java面试题内容的话,就快一直关注我们网站吧。

推荐阅读:

spring ioc容器初始化过程是怎样的?详解

spring ioc实现原理详解

spring ioc注入方式有几种?该怎么实现?