(面试问题我们一般从四个方面来回答①为什么要使用②是什么③怎么用④在哪里用)
传统上创建对象都需要自己new出来,而ioc是将new对象的控制权交给工厂,由工厂来创建,相比于传统的方法,效率提升了很多。
如果对象之间存在很多依赖关系,那么当需要修改维护其中一个对象时,会导致所有的对象都需要修改,牵一发而动全身。而ioc减少了代码之间的耦合,更好的管理对象。
ioc的全英文名是:Inversion Of Control ,直译过来就是控制反转,控制反转是把传统上由程序代码直接操控对象(new对象)的调用权交给ioc容器,由容器来实现对象的创建,依赖,销毁,初始化等等。
这里都说到了ioc容器,那么他的初始化流程和功能是什么呢?
1.spring启动之后,读取xml配置信息、注解、java类,将每一个bean配置解析为一个BeanDefinition对象,再将所有的BeanDefinition对象放入BeanDefinitionMap中(其中bean的id为key键,BeanDefinition对象为值)。 2.从beanDefinitoinMap中取出所有的非懒加载beanDefinition实例化bean(通过反射来实例化),并将bean加载进缓存,即放入singletonObjects(仅单例)的map中。
优点:
1.加快了开发的效率,可以不用自己一个个new来创建对象,能通过工厂统一的创建。 2.消减了代码之间的耦合,提高了代码的可维护性和灵活性。 3.节约内存,减少了大量的创建对象,维护依赖,销毁对象的代码。
缺点:
1.需要去学习使用怎么去创建对象,相对于传统方法复杂一些。 2.利用反射来创建对象,单从反射和new的两种创建对象方法上对比,效率上折损了一些。