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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 深入SpringBoot源码(十二)ApplicationContext与BeanFactory的创建 -> 正文阅读

[游戏开发]深入SpringBoot源码(十二)ApplicationContext与BeanFactory的创建

在这里插入图片描述
SpringApplication的createApplicationContext是用于创建ApplicationContext的策略方法。默认情况下,此方法将尊重任何显式设置的应用程序上下文类或工厂,然后再回退到合适的默认值。此方法返回的应用程序上下文是尚未刷新的。

	private ApplicationContextFactory applicationContextFactory = ApplicationContextFactory.DEFAULT;

	protected ConfigurableApplicationContext createApplicationContext() {
		return this.applicationContextFactory.create(this.webApplicationType);
	}

ApplicationContextFactory是用于创建SpringApplication使用的ConfigurableApplicationContext的策略接口(是一个函数式接口)。创建的上下文应该以其默认形式返回, SpringApplication负责配置和刷新上下文。

@FunctionalInterface
public interface ApplicationContextFactory {

	/**
	 * 一个默认的ApplicationContextFactory实现,它将为WebApplicationType创建一个适当的上下文。
	 */
	ApplicationContextFactory DEFAULT = (webApplicationType) -> {
		try {
			switch (webApplicationType) {
			case SERVLET:
				return new AnnotationConfigServletWebServerApplicationContext();
			case REACTIVE:
				return new AnnotationConfigReactiveWebServerApplicationContext();
			default:
				return new AnnotationConfigApplicationContext();
			}
		}
		catch (Exception ex) {
			throw new IllegalStateException("Unable create a default ApplicationContext instance, "
					+ "you may need a custom ApplicationContextFactory", ex);
		}
	};

	/**
	 * 根据给定的webApplicationType创建SpringApplication的application context。
	 */
	ConfigurableApplicationContext create(WebApplicationType webApplicationType);

	/**
	 * 创建一个ApplicationContextFactory,它将通过其主构造函数实例化给定的contextClass来创建上下文。
	 */
	static ApplicationContextFactory ofContextClass(Class<? extends ConfigurableApplicationContext> contextClass) {
		return of(() -> BeanUtils.instantiateClass(contextClass));
	}

	/**
	 * 创建一个ApplicationContextFactory,它将通过调用给定的Supplier创建上下文。
	 */
	static ApplicationContextFactory of(Supplier<ConfigurableApplicationContext> supplier) {
		return (webApplicationType) -> supplier.get();
	}

}

由于我的应用引入了spring-boot-starter-webflux,所以在调用ApplicationContextFactory的create方法时传入的webApplicationType为REACTIVE,返回的是AnnotationConfigReactiveWebServerApplicationContext实例。
在这里插入图片描述
在这里插入图片描述

/**
 * 使用steps检测应用程序启动阶段。
 * 核心容器及其基础设施组件可以使用ApplicationStartup来标记应用程序启动期间的步骤,并收集有关执行上下文或其处理时间的数据。
 * @since 5.3
 */
public interface ApplicationStartup {

	/**
	 * 默认“无操作” ApplicationStartup实现。
	 * 此变体旨在最小化开销,并且不记录数据。
	 */
	ApplicationStartup DEFAULT = new DefaultApplicationStartup();

	/**
	 * 创建一个新步骤并标记它的开始。步骤名称描述当前操作或阶段。这个技术名称应该是“.”命名空间,并且可以在应用程序启动期间重用于描述同一步骤的其他实例。
	 */
	StartupStep start(String name);

}

createApplicationContext方法执行完毕后,接着调用AnnotationConfigReactiveWebServerApplicationContext的setApplicationStartup方法,由于AnnotationConfigReactiveWebServerApplicationContext本身不重写该方法,所以调用的是GenericApplicationContext的setApplicationStartup方法。
在这里插入图片描述
GenericApplicationContext的setApplicationStartup方法:

	private final DefaultListableBeanFactory beanFactory;

	public void setApplicationStartup(ApplicationStartup applicationStartup) {
		super.setApplicationStartup(applicationStartup);
		this.beanFactory.setApplicationStartup(applicationStartup);
	}

最终赋值给了AbstractApplicationContext的成员字段applicationStartup。
在这里插入图片描述
GenericApplicationContext的setApplicationStartup方法还有一段代码是调用其成员字段beanFactory的setApplicationStartup方法。
在这里插入图片描述
beanFactory是DefaultListableBeanFactory的实例。SpringApplication的createApplicationContext是通过创建GenericApplicationContext的无参构造方法创建AnnotationConfigReactiveWebServerApplicationContext的。

	public GenericApplicationContext() {
		this.beanFactory = new DefaultListableBeanFactory();
	}

DefaultListableBeanFactory是Spring的ConfigurableListableBeanFactory和BeanDefinitionRegistry接口的默认实现,是一个基于 bean 定义元数据的成熟 bean 工厂,可通过后处理器进行扩展。典型用法是在访问 bean 之前首先注册所有 bean 定义(可能从 bean 定义文件中读取,按名称查找Bean是本地bean定义表中的一种低成本操作,它对预先解析的bean定义元数据对象进行操作。)。
DefaultListableBeanFactory的层次性关系:
在这里插入图片描述
DefaultListableBeanFactory的无参构造器:

	public DefaultListableBeanFactory() {
		super();
	}

AbstractAutowireCapableBeanFactory是实现默认bean创建的抽象bean工厂超类,具有RootBeanDefinition类指定的全部功能。除了 AbstractBeanFactory的createBean方法外,还实现了AutowireCapableBeanFactory接口。AbstractAutowireCapableBeanFactory提供 bean 创建(使用构造函数解析)、属性填充、连接(包括自动连接)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。AbstractAutowireCapableBeanFactory支持自动装配构造函数、按名称的属性和按类型的属性(其子类要实现的主要模板方法是resolveDependency(DependencyDescriptor, String, Set, TypeConverter) ,用于按类型自动装配。如果工厂能够搜索其bean定义,匹配的 bean通常将通过这样的搜索来实现。对于其他工厂风格,可以实现简化的匹配算法)。AbstractAutowireCapableBeanFactory的无参构造器:

	public AbstractAutowireCapableBeanFactory() {
		super();
		ignoreDependencyInterface(BeanNameAware.class);
		ignoreDependencyInterface(BeanFactoryAware.class);
		ignoreDependencyInterface(BeanClassLoaderAware.class);
		if (NativeDetector.inNativeImage()) {
			this.instantiationStrategy = new SimpleInstantiationStrategy();
		}
		else {
			this.instantiationStrategy = new CglibSubclassingInstantiationStrategy();
		}
	}
	
	/** 创建bean实例的策略。 */
	private InstantiationStrategy instantiationStrategy;

	/**
	 * 在依赖检查和自动装配时忽略依赖接口,作为类对象集。默认情况下,仅忽略 BeanFactory 接口。
	 */
	private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>();

	/**
	 * 忽略给定的依赖接口以进行自动装配。这通常被应用程序上下文用于注册以其他方式解析的依赖项,例如通过BeanFactoryAware的BeanFactory或通过ApplicationContextAware的ApplicationContext。
	 * 默认情况下,仅忽略 BeanFactoryAware 接口。要忽略其他类型,请为每种类型调用此方法。
	 */
	public void ignoreDependencyInterface(Class<?> ifc) {
		this.ignoredDependencyInterfaces.add(ifc);
	}
/**
 * 用于检测 GraalVM 原生镜像环境的通用委托。
 * 需要使用-H:+InlineBeforeAnalysis本机映像编译器标志,以允许在构建时删除代码。
 */
public abstract class NativeDetector {

	// See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java
	private static final boolean imageCode = (System.getProperty("org.graalvm.nativeimage.imagecode") != null);

	/**
	 * 如果在image构建的上下文中或在图像运行期间调用,则返回true ,否则返回false 。
	 */
	public static boolean inNativeImage() {
		return imageCode;
	}
}

AbstractBeanFactory是BeanFactory实现的抽象基类,提供ConfigurableBeanFactory SPI的全部功能。AbstractBeanFactory可以用作bean 工厂实现的基类,它从一些后端资源获取bean定义(其中bean定义访问是一项昂贵的操作)。此类提供单例缓存(通过其基类DefaultSingletonBeanRegistry、单例/原型确定、FactoryBean处理、别名、合并子bean定义的bean定义和bean销毁(通过org.springframework.beans.factory.DisposableBean接口,自定义销毁方法)。此外,它可以通过实现org.springframework.beans.factory.HierarchicalBeanFactory接口来管理bean工厂层次结构(在未知bean的情况下委托给父级)。
子类实现的主要模板方法是getBeanDefinition和createBean,分别检索给定bean名称的bean定义和为给定bean定义创建 bean 实例。这些操作的默认实现可以在DefaultListableBeanFactory和AbstractAutowireCapableBeanFactory中找到。AbstractBeanFactory的无参构造器:

	public AbstractBeanFactory() {
	}
  游戏开发 最新文章
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-24 09:46:08  更:2022-04-24 09:47:44 
 
开发: 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 22:02:59-

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