Spring IOC的常见面试题

为什么需要IOC?

1.效率方面
传统上创建对象都需要自己new出来,而ioc是将new对象的控制权交给工厂,由工厂来创建,相比于传统的方法,效率提升了很多。

2.管理对象方面
如果对象之间存在很多依赖关系,那么当需要修改维护其中一个对象时,会导致所有的对象都需要修改,牵一发而动全身。而ioc减少了代码之间的耦合,更好的管理对象。

IOC是什么?

ioc的全英文名是:Inversion Of Control ,直译过来就是控制反转,控制反转是把传统上由程序代码直接操控对象(new对象)的调用权交给ioc容器,由容器来实现对象的创建,依赖,销毁,初始化等等。

什么是 Spring IOC 容器?

Spring 框架是一个 IoC 容器的实现,DI 依赖注入是它的实现的一个原则,提供依赖查找和依赖注入两种依赖处理,管理着 Bean 的生命周期。Spring 还提供了 AOP 抽象、事件抽象、事件监听机制、SPI 机制、强大的第三方整合、易测试性等其他特性。

IOC 容器的职责?

依赖处理,通过依赖查找或者依赖注入
管理托管的资源(Java Bean 或其他资源)的生命周期
管理配置(容器配置、外部化配置、托管的资源的配置)

IOC 和 DI 的区别?

DI 依赖注入不完全等同于 IoC,更应该说 DI 依赖注入是 IoC 的一种实现方式或策略。
依赖查找和依赖注入都是 IoC 的实现策略。依赖查找就是在应用程序里面主动调用 IoC 容器提供的接口去获取对应的 Bean 对象,而依赖注入是在 IoC 容器启动或者初始化的时候,通过构造器、字段、setter 方法或者接口等方式注入依赖。依赖查找相比于依赖注入对于开发者而言更加繁琐,具有一定的代码入侵性,需要借助 IoC 容器提供的接口,所以我们总是强调后者。依赖注入在 IoC 容器中的实现也是调用相关的接口获取 Bean 对象,只不过这些工作都是在 IoC 容器启动时由容器帮你实现了,在应用程序中我们通常很少主动去调用接口获取 Bean 对象。

IOC容器的初始化流程和功能?

在这里插入图片描述

IOC容器的初始化流程就是bean的创建过程

概念态—刚在标签里写上还没有加载
定义态–把定义信息读到BeanDefinition中
纯静态–通过反射刚拿到实例化对象(里面的属性还没有赋值所以是纯净的)
成熟态–里面的属性注入完成
1.spring启动之后,读取xml配置信息、注解、java类,将每一个bean配置解析为一个BeanDefinition对象,再将所有的BeanDefinition对象放入BeanDefinitionMap中(其中bean的id为key键,BeanDefinition对象为值)。
2.从beanDefinitoinMap中取出所有的非懒加载beanDefinition实例化bean(通过反射来实例化),并将bean加载进缓存,即放入singletonObjects(仅单例)的map中。

IOC的优缺点?

优点:

1.加快了开发的效率,可以不用自己一个个new来创建对象,能通过工厂统一的创建。
2.消减了代码之间的耦合,提高了代码的可维护性和灵活性。
3.节约内存,减少了大量的创建对象,维护依赖,销毁对象的代码。

缺点:

1.利用反射来创建对象,单从反射和new的两种创建对象方法上对比,效率上折损了一些。
2. 创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
3 缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。

IOC有哪些扩展点?什么时候用?

所谓的扩展点就是底层对外提供的一些扩展接口

1.BeanPostProcessor 后置处理器的实现
BeanPostProcessor 后置处理器是 Spring IOC 容器经常使用到的一个特性, 这个 Bean 后置处理器是一个监听器, 可以监听容器触发的 Bean 声明周期事件。 后置处理器向容器注册以后, 容器中管理的 Bean 就具备了接收 IOC 容器事件回调的能力。 BeanPostProcessor 的使用非常简单, 只需要提供一个实现接口 BeanPostProcessor 的实现类, 然后在 Bean 的配置文件中设置即可

2.initializeBean方法为容器产生的Bean实例对象添加BeanPostProcessor后置处理器
同样在AbstractAutowireCapableBeanFactory类中,initializeBean方法实现为容器创建的Bean实例对象添加BeanPostProcessor后置处理器。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值