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

springBoot Bean加载流程

当Bean C并不依赖其他Bean时,其创建流程与一般的Spring Bean创建流程基本一致,但在依赖注入等环节会相对简单,以下是其主要的创建流程:

资源定位与加载

  • 定位配置资源:Spring启动时,会根据配置文件的路径或名称等信息,通过ResourceLoadergetResource()方法将配置文件定位到具体的资源位置,如类路径下、文件系统等。
  • 加载Bean定义:使用相应的BeanDefinitionReader实现类,如XmlBeanDefinitionReaderAnnotationBeanDefinitionReaderloadBeanDefinitions()方法来加载配置文件中的Bean C的定义信息。

注册BeanDefinition

  • 将上一步加载得到的Bean C的BeanDefinition对象注册到BeanDefinitionRegistry中,通常是DefaultListableBeanFactory。此时,Bean C的基本信息,如类名、作用域等都已经被解析并存储在BeanDefinition对象中。

依赖注入前准备

  • AbstractBeanFactorypreInstantiateSingletons()方法中,会遍历所有已注册的BeanDefinition对象,对Bean C进行实例化前的准备工作。如果Bean C是非延迟加载的单例Bean,则会调用getBean()方法进行实例化。

创建Bean实例

  • 实例化BeanAbstractAutowireCapableBeanFactorycreateBean()方法是创建Bean C实例的核心方法。首先,它会根据BeanDefinition获取Bean C的类信息,然后使用反射机制通过instantiateBean()方法创建一个原始的Bean C实例。

填充属性

  • 由于Bean C并不依赖其他Bean,所以在populateBean()方法中,不需要进行复杂的依赖注入操作,只需要对一些基本的属性进行设置,如对基本数据类型属性进行赋值等。

执行Aware接口方法

  • invokeAwareMethods()方法中,会检查Bean C实例是否实现了BeanNameAwareBeanClassLoaderAwareBeanFactoryAwareAware接口。如果实现了这些接口,则会调用相应的接口方法,将Bean的名称、类加载器、所属的BeanFactory等信息传递给Bean C实例。

执行BeanPostProcessor的前置处理方法

  • applyBeanPostProcessorsBeforeInitialization()方法中,会遍历所有已注册的BeanPostProcessor实现类。对于每个BeanPostProcessor,会调用其postProcessBeforeInitialization()方法,对Bean C实例进行前置处理。

执行初始化方法

  • invokeInitMethods()方法中,会根据BeanDefinition中的配置,调用Bean C实例的初始化方法。如果在Bean C的定义中指定了init-method属性,则会通过反射调用该方法;如果Bean C实现了InitializingBean接口,则会调用其afterPropertiesSet()方法。

执行BeanPostProcessor的后置处理方法

  • 与前置处理方法类似,在applyBeanPostProcessorsAfterInitialization()方法中,会再次遍历所有已注册的BeanPostProcessor实现类。对于每个BeanPostProcessor,会调用其postProcessAfterInitialization()方法,对经过初始化后的Bean C实例进行后置处理。

Bean注册完成

  • 最后,将完全初始化好的Bean C实例添加到单例Bean缓存中,通过addSingleton()方法完成Bean C的注册。后续当再次获取该Bean时,直接从缓存中获取即可。

http://www.kler.cn/a/450016.html

相关文章:

  • windows下安装配置anaconda及常用的conda命令
  • 开发一个DApp项目:DeFi、DApp开发与公链DApp开发
  • WebAPI编程(第一天,第二天)
  • 【087】基于51单片机智能宠物喂食器【Proteus仿真+Keil程序+报告+原理图】
  • ubuntu 24.04-无域名创建本机和局域网和同网段局域网机器可访问的https网页服务
  • 利用.NET Upgrade Assitant对项目进行升级
  • k8s总结
  • 汉塔科技-上网行为管理系统 ping.php 远程命令执行漏洞复现
  • 梳理你的思路(从OOP到架构设计)_设计模式Observer模式
  • OPPO Android面试题及参考答案 (上)
  • 006_ipc概述及共享内存
  • Linux 下SVN新手操作手册
  • 解析mysqlbinlog
  • Word使用分隔符实现页面部分分栏
  • Kotlin - 协程结构化并发Structured Concurrency
  • CSS|13 position属性
  • [c++11(二)]Lambda表达式和Function包装器及bind函数
  • 数据结构---------二叉树前序遍历中序遍历后序遍历
  • MyBatis执行完sql后,返回的数值代表的意思
  • 基于PX4的多无人机集群中的的配置
  • 【软考高级】系统架构设计师复习笔记-精华版
  • 【C语言】判断回文
  • #error: WinSock.h has already been included解决方案
  • 解决PotPlayer无法播放S/W HEVC(H265)解码的视频
  • JVM 常用的参数说明与配置指南
  • 信管通低代码信息管理系统应用平台