spring加载过程,源码带你理解从初始化到bean注入

时间:2023-03-09 02:39:32
spring加载过程,源码带你理解从初始化到bean注入

spring在容器启动时,容器正式初始化入口refresh()
如下图 ①包括初始化FactoryBean、解析XML注册所有BeanDefinition信息  ②包括注册scope管理类  ③初始化单例、非延迟加载的类
(spring在同一个bean工厂容器中BeanDefinition不会有重名的,往容器注册BeanDefinition时会先判断是否存在  ①自动扫描的bean如果存在直接跳过  ②xml配置的bean如果会执行替换操作)

spring加载过程,源码带你理解从初始化到bean注入

1、spring在DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法中解析xml文件、加载项目包中的spring.handlers文件中的xml解析处理类(spring使用的是java原生的DOM解析xml文件)
2、spring配置文件中的每个标签都有对应的解析处理类,如:spring自动扫描标签解析类是ComponentScanBeanDefinitionParser(自动扫描处理类:ClassPathBeanDefinitionScanner)
3、spring-bean、spring-context包中META-INF/spring.handlers是spring指定的对应命名空间标签解析处理类
4、我们可以根据自己的需要扩展spring的解析功能,例如阿里巴巴的dubbo项目就使用了自己的标签扩展了spring的标签处理类DubboNamespaceHandler
spring加载过程,源码带你理解从初始化到bean注入

5、spring类定义默认是singleton、lazyInit=true,默认容器启动就会创建单例
6、假如配置中A类被B类引用时,即便A类不是singleton、lazyInit=true,spring容器创建B类时A类也会被创建
7、scope="prototype"的类容器只负责创建,spring不会管理它的生命周期
8、通过容器获取bean时都会调getBean方法,之后到AbstractBeanFactory的doGetBean方法进行创建前的处理判断
如下图中 ①判断当前bean工厂中是否有缓存  ②判断是否需父容器工厂处理(由ContextLoaderListener启动创建的容器 是 Servlet初始化创建的容器的父容器)  ③往下继续新建对象

spring加载过程,源码带你理解从初始化到bean注入

9、正式开始新建bean对象是在AbstractAutowireCapableBeanFactory的doCreateBean方法中进行
如下图中 ①:创建实例  ②填充实例属性/引用相关值(依赖注入)  ③执行初始化bean(如:实现了InitializingBean接口的afterPropertiesSet方法)
spring加载过程,源码带你理解从初始化到bean注入

参考文献:http://zk-chs.iteye.com/blog/2293013