IoC容器加载流程

IoC容器加载流程

流程主要分为两个阶段:

  1. Bean的配置解析阶段:将Bean的配置信息转换成BeanDefinition
  2. Bean的创建阶段:根据BeanDefinition进行Bean创建

1. 加载流程

1.1 配置解析

加载流程:

  1. 资源文件定位:一般是在ApplicationContext的实现类里完成的,ResourceLoader接口的getResource()方法,可以将外部的资源,读取为Resource类
  2. 加载配置文件:通过BeanDefinitionReader读取配置文件或配置类
  3. 注解扫描:根据ComonentScan注解的路径进行扫描,未指明时会从声明这个注解的配置类所在包以及其子包进行扫描,读取@Bean、@Component、@Service等Bean声明注解
  4. 解析注册BeanDefinition:针对扫描出来的bean信息进行解析,生成的对象注册到BeanDefinitionRegistry中(BeanDefinitionRegistry是一个接口,提供了向IoC容器中注册BeanDefinition的方法)

1.2 Bean创建

IoC容器中的bean默认为延迟加载只有在需要使用时才会被实例化。这个过程是通过Bean的getBean方法实现的。

创建流程

  1. 配置读取:根据Bean的名称或类型查找BeanDefinition;
  2. Bean实例化:容器根据BeanDefinition中的定义,调用Bean工厂实例化Bean对象。可以通过构造函数实例化、工厂方法实例化、静态工厂方法实例化等方式来创建Bean对象;
  3. Bean属性注入:通过BeanPostProcessor接口中的postProcessPropertyValues方法来对Bean的属性进行填充。这个过程是通过PropertyValues封装Bean的属性,然后使用依赖注入技术自动填充。这过程可以为构造注入或者设值注入;
  4. 处理依赖关系:容器会处理Bean之间的依赖关系,将依赖的Bean注入到需要的地方 ;
  5. 执行初始化方法:容器会调用Bean的初始化方法,可以通过实现InitializingBean接口或在配置文件中指定初始化方法来定义Bean的初始化逻辑。
  6. 注册Bean:容器会将实例化、属性设置和初始化完成的Bean对象注册到容器中,以便后续的使用和管理。

2. BeanDefinition

BeanDefinition 描述和定义Spring容器中Bean的元数据对象。

其中包含了许多属性,如 Bean 的名称、类型、作用域、构造函数参数、属性等等。

BeanDefinition 还可以设置生命周期回调方法,用于在 Bean 的生命周期中执行一些初始化或销毁操作。

这些可以通过 XML 配置、注解、Java 配置等方式进行配置:

XML定义

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个bean,其中class属性指定了类的全限定名,id属性是该bean的唯一标识 --><bean id="myBean" class="com.bean.DemoBean" ><!-- 这里可以配置构造函数参数、属性setter方法参数等 --></bean></beans>

注解定义

import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;@Getter
@Setter
@Component
public class DemoBeanA {private String name;}

@Configuration + @Bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DemoBean {@Bean("demoBeanA1")public DemoBeanA demoBeanA() {// 自定义装配 一般用于将第三方类库装配为bean 或者 需要自行设定一些参数的beanDemoBeanA demoBeanA = new DemoBeanA();demoBeanA.setName("demoBeanA");return demoBeanA;}}

代码注册

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;@Slf4j
public class DemoBeanRegister {static AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(DemoBean.class);public static void main(String[] args) {beanRegister(DemoBeanA.class);DemoBeanA demoBeanA = applicationContext.getBean(DemoBeanA.class);log.debug(demoBeanA.getName());}public static void beanRegister(Class<?> beanClass) {applicationContext.register(beanClass);applicationContext.refresh();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试时, 数据Mock为何如此重要?

一、为什么要mock 工作中遇到以下问题&#xff0c;我们可以使用mock解决&#xff1a; 1、无法控制第三方系统某接口的返回&#xff0c;返回的数据不满足要求 2、某依赖系统还未开发完成&#xff0c;就需要对被测系统进行测试 3、有些系统不支持重复请求&#xff0c;或有访问…

Qt安装时出现无法下载存档,环境配置,main中自定义类编译不过问题

1. Qt安装时出现无法下载存档 进入Qt安装程序exe所在的文件目录&#xff0c;一般在下载文件夹&#xff0c;右键打开cmd。cmd输入&#xff1a;对应的exe镜像提速。 .\qt-online-installer-windows-x64-4.8.0.exe --mirror https://mirrors.cloud.tencent.com/qt/ 2. 环境配置 …

构建SOA架构时应该注意的问题

1.原有系统架构中的集成需求 面向服务的体系结构本质上来说是一种具有特殊性质的体系结构&#xff0c;它由具有互操作性和位置透明的组件集成构建并互连而成。基于SOA的企业系统架构通常都是在现有系统架构投资的基础上发展起来的&#xff0c;我们并不需要彻底重新开发全部的子…

Jmeter压测 —— 1秒发送1次请求

场景&#xff1a;有时候测试场景需要设置请求频率为一秒一次&#xff08;或几秒一次&#xff09;实现方法一&#xff1a;1、首先需要在线程组下设置循环次数&#xff08;可以理解为请求的次数&#xff09; 次数设置为请求300次&#xff0c;其中线程数跟时间自行设置 2、在设置…

XSS(跨站脚本攻击)

1.什么是xss XSS全称&#xff08;Cross Site Scripting&#xff09;跨站脚本攻击&#xff0c;为了避免和CSS层叠样式表名称冲突&#xff0c;所以改为了 XSS&#xff0c;是最常见的Web应用程序安全漏洞之一,XSS是指攻击者在网页中嵌入客户端脚本&#xff0c;通常是JavaScript编写…

2002NOIP普及组真题 1. 级数求和

线上OJ&#xff1a; 【02NOIP普及组】级数求和 核心算法&#xff1a;暴力模拟 备注&#xff1a;此类题&#xff0c;考场上也可以考虑 打表 题解代码&#xff1a; #include <bits/stdc.h> using namespace std;int k, n 0; double s 0; int main() {scanf("%d&q…

【AI学习】OpenAI员工谈消融实验

jbetker&#xff08;OpenAI员工&#xff09;的博客不长&#xff0c;很好读&#xff0c;但是内容却别开生面、非常有见底。 消融实验真的很重要 我不再像以前那样阅读那么多论文了。这让我感到惊讶&#xff0c;因为我一直认为&#xff0c;当我把机器学习作为全职工作时&#x…

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册 晨控CK-UR12-E01 是天线一体式超高频读写器头&#xff0c;工作频率默认为902MHz&#xff5e;928MHz&#xff0c;符合EPC Global Class l Gen 2&#xff0f;IS0-18000-6C 标准&#xff0c;最大输出功率 33dBm。读卡器同时…

爬山算法详细介绍

爬山算法介绍 爬山算法&#xff0c;又称局部搜索算法或局部择优方法&#xff0c;是一种基于贪婪策略的优化算法。它采用启发式方法&#xff0c;是对深度优先搜索的一种改进&#xff0c;利用反馈信息帮助生成解的决策。其基本思想是从当前位置开始&#xff0c;在周围邻域内寻找…

Kubernetes学习总结知识点汇总

Kubernetes 是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation&#xff08;CNCF&#xff09;来维护。Kubernetes 提供了一个运行分布式系统的框架&#xff0c;能够无缝地扩展和…

vue3-使用富文本编辑器-wangEditor-文章发表1

最近在搞项目:我们组内几位成员正在搞一个网站搭建,以后更新会比较缓慢 引言:如果要网站要用的富文本编辑器的话,这边推荐用wangEditor 官网地址传送 : wangEditorhttps://www.wangeditor.com/ 我现在还在扩展我的写文章用的富文本编辑器 现在我将简单介绍一下其基本使用方…

#15松桑前端后花园周刊-Turborepo 2.0、ESLint v9.4.0、重新学习promise、CSS gap

⚡️行业动态 ESLint 推出了一个新的 ESLint 配置迁移器 ESLint 用户没有升级到 ESLint v9.x 的最大原因之一是迁移配置文件似乎很困难和复杂。因此 Eslint 推出eslint/migrate-config支持将. eslintrc 文件迁移到 eslint.config.js&#xff0c;以帮助用户提高配置文件的速度。…

如何把input复选框如何变成好看的圆形

在HTML和CSS中&#xff0c;默认的<input type"checkbox">元素通常呈现为一个小方块。要将复选框变为圆形&#xff0c;你需要使用CSS来自定义其样式。这通常涉及到隐藏默认的复选框并使用伪元素&#xff08;如::before或::after&#xff09;来创建一个新的圆形外…

PyTorch tutorials:快速学会使用PyTorch

准备深入学习transformer&#xff0c;并参考一些资料和论文实现一个大语言模型&#xff0c;顺便做一个教程&#xff0c;今天是番外篇&#xff0c;介绍下PyTorch&#xff0c;后面章节实现代码主要使用这个框架。 本系列禁止转载&#xff0c;主要是为了有不同见解的同学可以方便联…

# RocketMQ 实战:模拟电商网站场景综合案例(三)

RocketMQ 实战&#xff1a;模拟电商网站场景综合案例&#xff08;三&#xff09; 一、环境搭建&#xff1a;数据库表结构介绍 1、优惠券表 FieldTypeCommentcoupon_iddecigint(50) NOT NULL优惠券IDcoupon_pricedecimal(10,2) NULL优惠券金额user idbigint(50) NULL用户IDor…

Web 自动化测试(基于Pytest极简)

Pytest 初体验 在使用 Python 进行 Web UI 自动化测试时&#xff0c;我们除了使用 unittest 单元测试框架&#xff0c;还可以使用 pytest&#xff0c;本节实验就给大家简单的介绍一下 pytest。 环境配置 本系列实验我们借助 VS Code 工具编写代码&#xff0c;使用的 Python …

IP地址简介

一、IP地址 Internet Protocol Address&#xff0c;即网络层协议地址&#xff0c;是IP的缩写。 二、IP地址的作用 为什么不直接使用MAC&#xff0c;又加了一个IP地址呢&#xff1f; 事实上底层传输&#xff0c;最终使用的肯定是MAC地址&#xff0c;但是由于在以前&#x…

Elasticsearch-经纬度查询(8.x)

目录 一、开发环境 二、pom文件 三、ES配置文件 四、ES相关字段 五、ES半径查询 ES的字段类型:geo_point&#xff0c;可以实现以一个点为中心的半径查询(geo_distance query) ES 地里位置查询: 半径查询(geo_distance query)查询指定矩形内的数据(geo_bounding_box quer…

管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异

目录 一、侦听器&#xff08;watch&#xff09;是什么&#xff1f; 二、Vue2中的watch&#xff08;Options API&#xff09; 2.1、函数式写法 2.2、对象式写法 ①对象式基础写法 ②回调函数handler ③deep属性 ④immediate属性 三、Vue3中的watch 3.1、向下兼容&#xff…

部署higress到华为云

higress 部署与上云 k3s环境准备 [root@vm ~]# curl https://releases.rancher.com/install-docker/19.03.sh | sh [root@vm ~]# curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"[root@vm ~]# …