关于IOC的创建流程,本篇文章只介绍他的大体流程,旨在让多数人对spring有一个整体的概念,源码介绍将在下一篇文章讲解。
首先介绍一下IOC是什么, IOC全称Inversion of Control 中文直译叫做控制反转,这个概念非常抽象,导致初学者一头雾水(包括我在内,其实现在也只是一知半解,还请各位大佬指导),通常IOC这个概念会跟IOC容器一起出现。
那么spring的容器到底是什么,以及里面存储了一些什么东西。
spring容器,顾名思义就是一个存放东西的地方,java是面向对象的语言,所以,容器中存放的都是对象,但是在spring中,对象给起了一个名字,叫做bean,所以说,spring容器就是存放一个别名叫做bean的对象的地方。
那容器是以什么结构存放bean(也就是对象,后面就不再提这个了)呢?
可以看一下spring的源码是怎么存放的:
private final MapsingletonObjects = new ConcurrentHashMap<>(256);
可以看出来spring的单例模式的bean被存放到了一个concurrentHashMap中,获取bean的时候都会从这个map中尝试获取。
这个map中存放的key是String类型的,所以spring通过bean的名称来进行bean的寻找,Object中则存放着bean的各种信息,那么spring如何调用这些bean呢?
java中存在反射机制,可以通过类名和方法名称就可以实现类的调用和方法的调用,这也就是spring要用到反射原理的原因,这也就是解释了为什么spring的容器又叫IOC容器:我们这需要把bean的名字给spring,spring来控制对象的生成,这也就是依赖反转(我们把对象的创建控制权交给了spring)的由来。
spring容器的创建是通过调用refresh()方法来完成的,fresh方法中,通过多个方法的调用,来完成容器偶的创建。
大体流程可以分为以下步骤:
第一步:首先要做fresh前的准备工作prepareRefresh();
第二步,获取beanFactory,这个是创建bean的工厂,由他来统一管理bean的创建,
- 1、 obtainFreshBeanFactory();获取BeanFactory;
- 2、 prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)
- 3、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;
- 4、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;
注:postprocessor是spring的后置处理器,他是增强spring中各种组件功能的。上面的几个postprocessor就是增强beanFactory功能的。
第三步:开始对bean进行设置:
- 1、 registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)
- 2、initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析)
- 3、initApplicationEventMulticaster();初始化事件派发器
- 4、onRefresh();留给子容器(子类)子类重写这个方法,在容器刷新的时候可以自定义逻辑;
- 5、registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;
- 6、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean; 这一步完成所有bean的创建!bean就是从这里开始创建的。
第四步:finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;



