当前位置: 首页 > news >正文

applicationContext相关加载

spring refresh

概述

refresh是一个方法,spring中所有的ApplicationContext容器都需要通过refresh方法初始化;

在这里插入图片描述

处理步骤

其中refresh方法包含12个主要的处理步骤:
在这里插入图片描述

1、第1个步骤做前置准备

2、第2~6步骤创建BeanFactory(ApplicationContext核心功能由BeanFactory完成)

3、第7~12准备ApplicationContext,其中11步创建初始化容器中的单例bean;

1、prepareRefresh

这个过程创建准备Environment对象

Environment对象存储了java和系统的一些键值信息;

最重要的是存储我们自定义配置的application.properties;

总结

  • 作用之一是为后续@value,值注入提供键值

在这里插入图片描述

测试

解析@value注解配置的值

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、obtainFreshBeanFactory

  • 这一步创建或者获取BeanFactory
  • BeanFactory虽然和ApplicationContext是继承关系,但是一般是配合使用的,ApplicationContext对负责bean创建,依赖注入和初始化仍然是直接调用的BeanFactory的方法;
  • BeanDefinition规定了bean的特征,如单例多例,依赖关系
  • BeanDefinition可以通过xml及配置类获得,也可通过组件扫描获得;

BeanFactory通过BeanDefinition收集信息后创建bean

在这里插入图片描述

测试

我们可以看到beandefinition初始为空;

在这里插入图片描述

我们接着在xml中配置bean

在这里插入图片描述

可以看到beandifinition已经不为空;

在这里插入图片描述

也可通过配置类配置bean

在这里插入图片描述

在这里插入图片描述

也可以看到bean被注入了进来;

在这里插入图片描述

3、prepareBeanFactory

  • 完善BeanFactory
  • 了解谁来解析${ },应用ApplicationContext提供的Environment解析
  • 特殊bean的注入,BeanFactory,ApplicationContext

在这里插入图片描述

4、postProcessBeanFactory

在这里插入图片描述

  • 这一步是空实现,留给子类扩展

  • 模板方法的设计模式

5、invokeBeanFactoryPostProcessors

beanFactory的后处理器,充当BeanFactory扩展点;

可以用来补充修改BeanDefinition;

ConfigurationClasProcessor解析@Configuration @Bean import等补充到bean的map中;

6、registerBeanPostProcessors

加入更多的后处理器;

这一步只是注册,后续步骤才会使用;

7、initMessageSource

实现国际化;

容器中有messageSource,如果没有在map中找到,会自动创建;

8、initApplicationEventmulicaster

事件广播器,发送事件给监听器;

通过ApplicationContext的publishEvent(事件对象)来发布;

9、onRefresh

空实现,留给子类;

springboot中的子类在这准备webserver,即内嵌web容器;

10、RegisterListeners

initApplicationEventmulicaster管理发送监听事件,这里管理接收事件

需要实现ApplicationListerer,重写相关方法;

11、finishBeanFactoryInitialization

  • singletonObject单例池
  • embeddevalueresolves内嵌解析器,解析${ };
  • conversionService做类型转换

12finishRefresh

  • lifecycleProcessor生命周期处理器,控制容器内生命周期的管理;
  • 调用context.start可以触发所有实现lifecycle接口bean的start方法;

总结

在这里插入图片描述

http://www.lryc.cn/news/33656.html

相关文章:

  • 数据同步工具Sqoop
  • Kafka 版本
  • ElasticSearch 在Java中的各种实现
  • SpringBoot整合Knife4j
  • MyISAM和InnoDB存储引擎的区别
  • SpringMVC自定义处理多种日期格式的格式转换器
  • NYUv2生成边界GT(1)
  • Spring基本概念与使用
  • 安恒信息java实习面经
  • 第八章:枚举类与注解
  • Ceph介绍
  • remove 和 erase 的区别
  • NFTScan:怎么使用 NFT API 开发一个 NFT 数据分析平台?
  • ECOLOY直接更换流程表单后导致历史流程中数据为空白的解决方案
  • mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制
  • SpringBoot整合MybatisPlus
  • 中电金信Gien享汇・大数据专题|金融行业数据架构及模型演进
  • Cadence Allegro 导出Design Cross Section报告详解
  • 【LeetCode】剑指 Offer 23. 链表中环的入口节点 p139 -- Java Version
  • LeetCode-96. 不同的二叉搜索树
  • JavaWeb基础
  • C++基础了解-03-C++变量类型
  • 树莓派4b——通过mjpg-streamer使用摄像头
  • MySQL运维篇之读写分离
  • windows程序最小化到托盘并显示提示信息
  • 使字符串平衡的最少删除次数(简单动态规划)
  • linux网络广播使用
  • Kubernetes源码学习
  • 筑基九层 —— 指针详解
  • 内存清理、动画制作、CPU检测等五款实用软件推荐