java语言是使用最广的开发语言,而spring是java开发中所有框架的基础,掌握spring就已经拿下框架的半壁江山。本篇是纵观spring全局,宏观把控spring框架的开端。
1 spring是什么
先简单说一下spring概念。
spring是一个容器,容器里面存放的是bean(对象),spring同时提供了对于bean创建和管理的一套机制。
容器实现的整个流程如下图:
spring ioc是它的实现思想; spring framework是它的项目名称; spring aop是bean生命周期中的一个阶段; spring mvc和spring boot都是以spring为基础实现,区别是mvx是基于xml的注入形式,boot是基于注解的注入形式,但是底层注入原理是一样的。
Spring容器的意义是什么呢?
其实spring容器最大意义是通过依赖注入实现控制反转,从而降低耦合度,提高可维护性,说的通俗一点就是把对象的创建和对象与对象之间的依赖关系不再由程序员来维护,而是由spring负责创建对象,并管理这些对象,程序员只需要在使用的时候取出来就可以了。
只不过spring在实现容器的过程中,会额外做很多的处理。
2 spring容器如何实现
我们以现在常用的注解形式源码来探讨spring,上面的图中就是spring启动过程中的整个流程。
创建工场
DefaultListableBeanFactory是BeanFactory家族的子子孙孙中的一员,不过我们在spring上下文中主要就是用它,它提供bean创建过程中的大部分工具类,缓存,变量等等。贯穿整个流程,总之很重要。
创建读取器
AnnotatedBeanDefinitionReader是读取器,注解形式注入的时候,此类就是负责把需要spring管理的类解析成spring想要的类型,然后spring在后续的过程中才好开展工作。
如果是xml形式注入的话,读取器就是XmlBeanDefinitionReader。
创建扫描器
ClassPathBeanDefinitionScanner是扫描器,在注解形式注入的时候,负责主动去扫描加了@Component注解的类,找到这些类后再有上面的读取器进行读取解析。
注册配置类
AnnotatedBeanDefinitionReader.register(componentClasses)
componentClasses是配置类,这行代码的作用就是把配置类读取解析成spring的想要的类型。这里只会读取配置类,其他的类会在后面读取,之所以提前读取配置类是因为配置类是spring启动过程的核心类,后续的很多动作都需在配置类中获取信息,因此需要早一点读取解析它。
refrsh方法
上面的几个步骤主要是把spring流程中需要的几个大件创建创建好,那么refrsh方法就正式进入spring启动的流程中了,此方法中调用了12个方法,每个方法都有各自的负责的事情:
- prepareRefresh方法
- obtainFreshBeanFactory方法
- prepareBeanFactory(beanFactory)
- postProcessBeanFactory(beanFactory)
- invokeBeanFactoryPostProcessors(beanFactory)
- registerBeanPostProcessors(beanFactory)
- initMessageSource()
- initApplicationEventMulticaster()
- onRefresh()
- registerListeners()
- finishBeanFactoryInitialization(beanFactory)
- finishRefresh()
本篇只是概括整体流程,不对每个方法做详细介绍。概括来说:
invokeBeanFactoryPostProcessors这个方法里面会执行BeanFactoryPostProcessor,主要来说就是具体的扫描动作是由这一步完成。
registerBeanPostProcessors这个方法就是实例化后置处理器,后置处理器可以理解为bean创建过程中的工具类,bean创建前肯定要先把工具类创建好,以备后续用到。
finishBeanFactoryInitialization这个方法就是开始真正的创建bean,开启bean的生命周期,直到把创建好的bean放入单例池。在此之前spring做的事情都是为创建bean做准备。
其他的几个方法也是在做相关的准备动作,比如为bean工场填充一些属性,标记,环境配置,初始化监听器,初始化广播器,实例化工具类,国际化相关,设置类加载器等等,还有一些方法是空方法,利用模板方法模式给继承者实现的。
本篇主要是粗略讨论下spring的整个流程,具体细节我们接下来慢慢讨论,欢迎留言。
如果需要带注释的spring源码或者了解更多行业技能请关注微信公众号 码农本农