IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Spring源码学习一——容器启动过程上 -> 正文阅读

[游戏开发]Spring源码学习一——容器启动过程上

一、AnnotationConfigApplicationContext构造方法

启动一个注解配置的容器

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

进入构造方法
在这里插入图片描述

1.1 this()

先看下this(),执行之前会先执行父类的构造方法,完成beanFactory赋值
在这里插入图片描述
接着进入子类的构造方法
在这里插入图片描述
这块初始化了两个重要的对象,reader用于注册指定的类(无需Component注解)到容器,scanner用于注册指定路径下的类(带有Component/Repository/Service/Controller),这两个对象实例化时传入的是this,说明AnnotationConfigApplicationContext就是容器本身

1.2 register()

再往下,进入register(componentClasses);
在这里插入图片描述
使用reader将componentClass注册进容器,执行完之后
在这里插入图片描述
bean已经被添加进beanFactory的beanDefinitionMap。AnnotationConfigApplicationContext也是实现了BeanFactory接口,他的父类GenericApplicationContext持有了DefaultListableBeanFactory,看下GenericApplicationContext
在这里插入图片描述
明显这块使用了装饰器模式,增强了beanFactory。同时GenericApplicationContext又实现了BeanDefinitionRegistry,具有了读取注册bean的功能,又使用了适配器模式

1.3 refresh()

AbstractApplicationContext.refresh()方法将刷新启动容器
在这里插入图片描述
refresh方法启动容器调用了12个方法

  1. prepareRefresh();
  2. obtainFreshBeanFactory();
  3. prepareBeanFactory(beanFactory);
  4. postProcessBeanFactory(beanFactory);
  5. invokeBeanFactoryPostProcessors(beanFactory);
  6. registerBeanPostProcessors(beanFactory);
  7. initMessageSource();
  8. initApplicationEventMulticaster();
  9. onRefresh();
  10. registerListeners();
  11. finishBeanFactoryInitialization(beanFactory);
  12. finishRefresh();

下面我们看看每个方法的作用

二、容器启动生命周期

2.1 prepareRefresh()

prepareRefresh做的是容器刷新前的一些准备工作

  • 设置容器的启动时间
  • 设置活跃状态active为true
  • 设置关闭状态为false
  • 处理Environment对象
  • 准备监听器和事件的集合,默认为空

跟代码看下
在这里插入图片描述
看注释,意思是准备容器更新,设置启动时间和激活标志以及执行所有属性源的初始化。后半句其实是执行initPropertySources();
在这里插入图片描述
在上下文环境中初始化任何占位符属性源,这是一个模板方法,提供给子类扩展使用。如果有带占位符的属性源,可以重写这个方法。例如在applicationContext.xml文件中有sping.test.username=${username},可以在重写的 initPropertySources();方法中加上getEnvironment().getSystemProperties().put(“sping.test.username”,“java”);达到重新赋值的目的。

getEnvironment().validateRequiredProperties();创建环境对象,加载系统属性变量到环境对象中,并验证是否含有必要的属性

2.2 obtainFreshBeanFactory()

该方法用于获得一个新的 BeanFactory
在这里插入图片描述

2.2.1 refreshBeanFactory()

在这里插入图片描述
GenericApplicationContext的refreshBeanFactory()方法,不支持多次刷新,只调用一次refresh方法。给beanFactory设置一个唯一ID

2.2.2 getBeanFactory()

在这里插入图片描述
直接返回GenericApplicationContext持有的单例beanFactory。

2.3 prepareBeanFactory(beanFactory)

在这里插入图片描述
注释是说配置容器标志特征属性,如类加载器、后置增强等。主要完成一下设置:

  • beanFactory.addBeanPostProcessor:
    注册了一堆BeanPostProcessor到AbstractBeanFactory的beanPostProcessors中,以便bean在初始化前后调用BeanPostProcessor的方法。这些BeanPostProcessor需要传入ApplicationContext,在做增强时能用上。
  • beanFactory.ignoreDependencyInterface:
    设置各种Aware接口的实现类为忽略自动装配,放入ignoredDependencyInterfaces(Set类型)
  • beanFactory.registerResolvableDependency:
    设置自动装配的类(BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext)。放入resolvableDependencies(Map类型),可以根据类型被注入
  • beanFactory.registerSingleton:
    注册各种可用组件(environment,systemProperties,systemEnvironment)

2.4 postProcessBeanFactory()

postProcessBeanFactory就是一个模板方法提供给子类扩展
在这里插入图片描述
自己扩展一个MyAnnotationConfigApplicationContext,就可以利用这个方法来修改beanFactory的属性,或者做一些其他操作

三、容器启动过程下

容器启动过程下

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:08:57  更:2022-04-26 12:10:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 23:58:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码