Spring IOC的常见面试题
为什么需要IOC?1.效率方面传统上创建对象都需要自己new出来,而ioc是将new对象的控制权交给工厂,由工厂来创建,相比于传统的方法,效率提升了很多。2.管理对象方面如果对象之间存在很多依赖关系,那么当需要修改维护其中一个对象时,会导致所有的对象都需要修改,牵一发而动全身。而ioc减少了代码之间的耦合,更好的管理对象。IOC是什么?ioc的全英文名是:Inversion Of Control
为什么需要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后置处理器。
更多推荐
所有评论(0)