您的位置:首页 > 编程语言 > Java开发

Spring IOC 和 DI原理 (面试必备)

2018-02-13 12:00 387 查看

一、IOC是什么?

IOC全称为“Inversion of Control”,即控制反转,不是一种技术,而是一种设计思想。在这种设计思想中,你设计好的对象交给容器管理,而不是在应用程序内部对对象进行管理。控制的含义是IOC容器控制了对象(也可以包括文件及其他外部资源);而反转的含义是IOC容器负责创建及注入依赖的对象,但在传统的应用程序中,我们需要在对象内部去创建(new)依赖的对象,这叫“正”,在这样的情况下,对象之间的耦合度就非常高。IOC更像是一种中介,帮助雇佣者和被雇佣者。我觉得支付工具如支付宝就像是淘宝体系中的一个IOC。

二、DI是什么?

DI全称为“Dependency Injection”,即依赖注入,在系统运行过程中,动态的向某个对象注入它所依赖的对象。比如A依赖一个对象B(一般依赖的是接口),在运行前,A并不知道自己依赖的B的具体实现是怎么样的,IOC容器会在适当的时候为A创建一个合适的B对象,并且注入,这就是依赖注入。

三、IOC与DI的关系?

IOC是一个比DI更为宽泛的概念,但是其思想是类似的。IOC是一种目的,DI是一种手段,为了达到控制反转的目的,即程序员不需要自己new对象,对象由容器控制这个目的,Spring框架提供了依赖注入的手段,哪里需要对象,就在哪里注入。

四、IOC的优点?

1、资源不再由使用的双方管理,而是由第三方集中管理,实现了资源的可配置和易管理,降低了使用双方的耦合度,使得面向接口编程更容易实现,使得系统架构可扩展性更加高。
2、易实现各种设计模式,如策略模式,不需要自己构建策略对象池(结合项目)。
3、不需要再new对象,编码更加简单。传统的开发中,Servlet依赖于一个XXXService时,需要在每个Serlvet中都new一个XXXService,容易导致对象重复,浪费JVM的堆空间,当然也可以使用单例模式,但是需要自己编写,代码更复杂。

五、Spring 容器结构。

简单的说,Spring容器中主要有Bean定义注册表、Bean缓存池。Bean定义注册表(BeanDefinitionRegistry)存储Bean定义(BeanDefinition),BeanDefinition描述Bean的配置信息,可以来自xml配置文件中的<bean>,也可以来自Java代码或注解声明的Bean。Bean缓存池是一个HashMap,Key为Bean的Id,而Value为对象。



                                    (图片来自网络)Spring 容器通过配置文件描述Bean描述信息及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布等高级服务。

六、BeanFactory

BeanFactory是Spring框架的基础设施,面向Spring本身,一般程序员不会直接使用BeanFactory,是各种BeanFactory的顶层接口,主要提供的是各种getBean()方法。

七、ApplicationContext

ApplicationContext是由BeanFactory派生而来,提供了许多更加高级的功能。

八、容器加载Bean的过程

1、BeanDefinitionReader读取Resource所执行的配置文件资源,解析配置文件,并将生成的BeanDefinition对象保存到BeanDefinitionRegistry中。
2、容器扫描Bean定义注册表中的BeanDefinition对象,调用InstantiationStrategy进行Bean实例化的工作;采用BeanWrapper完成Bean属性的设置工作。
3、若是单例的Bean,则将Bean缓存在Bean缓存器中。

部分内容参考:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息