标签:调用 Spring 流程 bean 实例 整理 方法 3.8
spring启动流程
1 new Context(config.class) 会进入构造方法 开始容器初始化逻辑流程
2 生产 reader 并注册 启动类 和一些默认的框架后置处理器
比如用来
给bean排序的 AnnotationAwareOrderComparator,
扫描bean的 ConfigurationClassPostProcessor,
解决@Autowired @Value 的 AutowiredAnnotationBeanPostProcessor
解决@Require(setter方法上面的注解 ) RequiredAnnotationBeanPostProcessor
解决java通用注解 @Resource @PostContruct @PreDestory等问题 CommonAnnotationBeanPostProcessor
3 refresh
3.1 prepareRefresh(); 准备reresh了
3.2 生产工厂 defaultListFactory
3.2 prepareBeanFactory 准备工厂参数(1 设置类的加载器,2 添加一些框架默认的后置处理器 比如 ApplicationContextAwareProcessor 用来处理awre,。。)
3.3 postProcessBeanFactory(beanFactory); 实际生产之前调用的方法
3.3 invokeBeanFactoryProcess 开始实际生产了 生产beanFactory后置处理器 并且调用它
这一步会调用到ConfigurationClassPostProcessor的方法 它是BeanDefinitionRegistryPostProcessor 的实例
BeanDefinitionRegistryPostProcessor其实也就是BeanFactoryPostProcessor的实例
执行顺序:BeanDefintionRegistryPostProcessor -> BeanfactoryPostProcesssor
它将会根据启动类的注解扫描整个项目的bean 并将其加入bean定义集合
同时 扫描的逻辑 是
0 扫描初始的容器配置类 一般是启动类
1 处理 @PropertySource
2 @ComponentScan 对于扫描到的每个bean 又会递归开始调用解析方法
3 @Import 引入的类
3.1为 ImportSelector 实例 那么将导入的类的 selectImports()方法返回的数组 当作新的import 继续此流程
3.2为 ImportBeanDefintionRegister 那么实例化 然后调用其方法
3.3为 DefferImportSeletor 那么不做操作 将其加入一个集合 最后才处理
这是为了假如某个配置类需要采集项目的配置的情况 比如springboot的配置类 需要最后才能得到容器的bean情况
3.4 都不是那么当作configtion普通类 继续流程 继续扫描
4 @ImportResource
5 @Bean
6 添加到一个configClass容器中
7 最后reader会把这个容器中的class 格式化BeanDefintion 添加到beanFactory
3.4 注册BeanPostProcessor
3.4 inint messageSource
3.5 准备enventMuster 事件广播器
3.6 onRefresh(); 准备开始生产bean之前会调用的方法
3.7 注册listener
3.8 实例化
对beanFactory中的beanDefintion集合 一个一个的进行下面的流程
3.8.0 getSingleton()方法 将当前beanName 加入正在创建 的标志集合中 然后正式开始创建
3.8.1 调用 instantPostBeanProcesssor.BeanPostProcessorsBeforeInstantiation() 方法 如果返回一个对象 则直接终止后续流程
3.8.2 调用 生成实例
3.8.3 调用 mergeBeanProcessor.postProcessMergedBeanDefinition 给一个修改 beanDefion定义的机会 可以在这一步检查注解等造作
3.8.4 添加进三级缓存 一个代码块 逻辑是根据现在的示例(上面 生成的) 提前生成它的的代理对象 对应的后置处理器:SmartInstantiationAwareBeanPostProcessor
3.8.5 解析当前bean的依赖
3.8.6 准备 初始化 方法
3.8.6.1 调用 beanProcessor.beforeIntiail 方法 (那些awre注入 还有那些依赖注入 在这一步设置)
3.8.6.2 调用 初始化方法 比如 实现了inintial 接口 ,@PostContruct(initPreDestoryBeanProcessor解决)
3.8.6.3 调用 beanProcessor.afterIntiail 一般情况 这一步后 会生成bean的完整对象
3.8.6.3 检查这个类是否需要放入 disposeBeans集合中 当容器关闭时 会触发对应的方法
3.8.7 将完整创建好的对象添加进一级缓存 从正在创建集合中移除当前beanName
备注:
一级缓存: singleObject 存放初始化完整的对象
二级缓存: eralySingleObjtct 存放的是未完全初始化的对象 这个对象还没有走完全部流程 只是提前完成了smartBeanPostProcessor处理器的增强
三级缓存: singleFactory 存放的是一个代码块 他能根据实例对象 返回它的增强对象
对beanFactory中的beanDefintion集合 一个一个的进行下面的流程 如果它的实例类型是SmartInitializingSingleton 那么调用其回调方法
3.9 finishRefresh() 结束 生成lifeCycle类 并调用启动方法 清除一些缓存 发布启动事件
标签:调用,Spring,流程,bean,实例,整理,方法,3.8 来源: https://www.cnblogs.com/pupansheng/p/16501903.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。