我是一个会敲代码的汤姆猫,为什么叫汤姆?因为我的女朋友叫杰瑞!
前言:为了应对接下来几个月的面试,开始系统的整理自己的知识体系,希望下次面试能得到一个好的offer。
今天看了一篇很不错的讲解IOC的文章,一个小姐姐写的二,帮自己解惑了,觉得真的不错,所以自己在此做个总结!
原文章在此
1、IOC容器的分类
Spring中IOC容器有两个:BeanFactory
ApplicationContext。
2、BeanFactory解析
BeanFactory是最底层的IOC容器,BeanFaccory只是实现了简单的容器,可以将它理解为实现了get、put方法的HashMap。
HashMap中的key是beanName,value是beanObject。
其中在BeanFactory中是通过懒加载的方式创建容器的。
3、ApplicationContext解析
ApplicationContext是BeanFactory的子类,对BeanFactory的补充以及增加了更多的功能。
ApplicationContext包含了两个子类:ClassPathXmlApplicationContext
、FileSystemXmlApplicationContext
4、IOC解析
4.1、IOC容器是存储什么的容器呢?
答案是:`对象`
该容器中存储了程序中我们需要用到的各种对象以及资源。
4.2、控制反转
说完了容器开始说字面的意思,也就是IOC要表达的就是控制反转,那么IOC的控制是什么意思?又控制的什么呢?又反转了什么呢?
答案是:控制代表的是:bean的创建和管理
控制了什么:控制的是bean的整个生命周期
反转:管理bean的权利交给Spring就是反转
4.3、IOC的主要作用
我们为什么要使用IOC这样的一种思想呢?
答案:`解耦`,解除对象之间的耦合关系,通过容器来管理对象之间的关系,即使一个对象做出了改变也不会影响整个系统的运行。
4.4、DI
(依赖注入)
说完了IOC再来说DI
!
DI
要分开说:
D(依赖):程序运行需要依赖一些外部资源
I(注入):容器加载了外部的资源,将这些资源注入给程序内的对象,维护程序对象资源之间的内外关系。
如何理解IOC与DI的关系呢:IOC其实是一种思想,而DI是IOC思想的具体实现。
5、创建对象
在IOC容器中当加载了Xml配置文件中的数据之后,是通过什么方式进行创建对象的呢?
答案就是:getBean
方法
通过getBean
方法实现了我们平时实现的new
创建对象。
同时对象在容器中是单例的也就是我们通过多次getBean获取到的对象是同一个。
上图中user
和user2
是同一个对象,如果通过equals去判断最后会返回true
我们可以通过修改配置文件中的scope
属性来改变单例模式。
6、bean的生命周期
- Spring 容器根据配置中的 bean 定义中实例化 bean。
- Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
- 如果 bean 实现
BeanNameAware
接口,则工厂通过传递 bean 的 ID 来调用setBeanName()
。 - 如果 bean 实现
BeanFactoryAware
接口,工厂通过传递自身的实例来调用setBeanFactory()
。 - 如果存在与 bean关联的任何
BeanPostProcessors
,则调用preProcessBeforeInitialization
() 方法。 - 如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调 用它。
- 最后,如果存在与 bean 关联的任何
BeanPostProcessors
,则将调用postProcessAfterInitialization
() 方法。 - 如果 bean 实现
DisposableBean
接口,当 spring 容器关闭时,会调用destory
()。 - 如果为bean 指定了
destroy
方法( 的 destroy-method 属性),那么将 调用它。
最后:我是会敲代码的汤姆