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

spring01-spring容器启动过程分析

【README】

本文总结自《spring揭秘》,作者王福强,非常棒的一本书,墙裂推荐;

spring容器根据配置元素组装可用系统分2个阶段,包括spring容器启动, springbean实例化阶段; 本文详细分析spring容器启动阶段;


【1】Spring容器根据配置元素组装可用系统的过程

Spring容器根据配置元素组装可用系统的过程,有2个阶段:

  • spring容器启动;
  • springbean实例化;
    在这里插入图片描述

容器启动阶段: 加载配置元数据(xml文件),然后使用工具类如 BeanDefinitionReader对加载的配置元数据进行解析,并将结果编组为 BeanDefinition ,注册到相应的 BeanDefinitionRegistry,这样容器启动工作就完成了;

Bean实例化阶段: 容器会首先检查所请求的对象之前是否已经初始化,若没有,则根据注册的BeanDefinition实例化bean,并为其注入依赖。 如果该对象实现了某些回调接口,也会根据回调接口的要求来装配它; 当该对象被装配完成后 ,容器会立即将其返回给请求方使用;


【2】BeanFactoryPostProcessor-Bean工厂后置处理器

BeanFactoryPostProcessor: Spring提供了叫做 BeanFactoryPostProcessor 容器扩展机制; 该机制允许我们在容器启动阶段完成后新增逻辑;

常用BeanFactoryPostProcessor:

  1. PropertySourcePlaceHolderConfigurer:属性占位符配置器, 如jdbc连接串属性通过properties文件的属性值 替换 占位符;
  2. PropertyOverrideConfigurer : 属性覆盖替换配置器;如修改属性值;
  3. CustomEditorConfigurer:自定义编辑器配置器,用于不同数据格式间的转换;

【补充】

(1)上述2个BeanFactoryPostProcessor 都是通过修改BeanDefinition 来对属性进行替换或修改的;

(2) CustomerEditorConfigurer:没有修改BeanDefinition,而是把后期要用到的信息注册到容器;

【2.1】属性占位符配置器使用场景代码

PropertySourcesPlaceholderConfigurer-属性占位符配置器使用场景:初始化数据库连接池属性, 并利用 PropertyOverrideConfigurer 重写属性值;

【PropertySourcesPlaceholderConfigurerMain】入口

public class PropertySourcesPlaceholderConfigurerMain {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans0404.xml");BasicDataSource dataSource = context.getBean("dataSource", BasicDataSource.class);System.out.println(dataSource.getUrl());System.out.println(dataSource.getUserName());System.out.println(dataSource.getDriverClassName());}
}

【beans0404.xml】

<!-- 为 PropertySourcesPlaceholderConfigurer 这个BeanFactoryPostProcessor 配置属性文件地址 --><bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"><property name="locations"><value>jdbc.properties</value></property></bean><!-- 为 PropertyOverrideConfigurer 这个BeanFactoryPostProcessor 配置重写属性文件的地址 --><bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"><property name="locations" value="ds-pool-override.properties" /></bean><!-- 数据源bean,其中属性值通过变量指定,变量通过 BeanFactoryPostProcessor 设置值--><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"><property name="url"><value>${jdbc.url}</value></property><property name="driverClassName"><value>${jdbc.driverClassName}</value></property><property name="username"><value>${jdbc.username}</value></property><property name="password"><value>${jdbc.password}</value></property></bean>

【jdbc.properties】

jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root

【ds-pool-override.properties】重写属性值的属性文件

dataSource.username=rootOverride

【打印日志】

jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai
rootOverride
com.mysql.cj.jdbc.Driver

【2.2】CustomerEditorConfigurer-自定义编辑器配置器

应用场景: xml配置的bean信息都是字符串,但最终都要要转换为bean对象的,从字符串类型到对象类型的转换,就是由CustomerEditorConfigurer(EditorConfigurer)来完成的;

  • 只要为每种对象类型提供一个 PropertyEditor,就可以做类型转换

Spring 提供的PropertyEditor列表

  • (1) StringArrayPropertyEditor:把符合csv格式的字符串转换为String[] 数组的形式;类似的还有 ByteArrayPropertyEditor, CharArrayPropertyEditor;
  • (2) ClassEditor: 根据class名称转为 Class对象;
  • (3) FileEditor: file类型的PropertyEditor;类似的还有InputStreamEditor, URLEditor;
  • (4) LocaleEditor: 本地化转换;
  • (5) PatternEditor: 正则表达式转换

自定义属性编辑器PropertyEditor: 继承自 PropertyEditorSupport ; PropertyEditorSupport 实现了 PropertyEditor 接口; PropertyEditor 接口定义如下:

public interface PropertyEditor {void setValue(Object value);Object getValue();boolean isPaintable();void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box);String getJavaInitializationString();String getAsText();void setAsText(String text) throws java.lang.IllegalArgumentException;String[] getTags();java.awt.Component getCustomEditor();boolean supportsCustomEditor();void addPropertyChangeListener(PropertyChangeListener listener);void removePropertyChangeListener(PropertyChangeListener listener);
}

【2.3】自定义编属性编辑器案例代码

自定义日期i字符串转日期类型的编辑器;

【CustomPropertyEditorMain】入口

public class CustomPropertyEditorMain {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans0404.xml");System.out.println(context.getBean("customDateDto", CustomDateDto.class));}
}

【beans0404.xml】

<!-- 自定义属性编辑器  -->
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"><property name="propertyEditorRegistrars"><list><ref bean="customDatePropertEditroResigtrar" /></list></property>
</bean>
<bean id="customDatePropertEditroResigtrar" class="com.tom.springnote.chapter04.t0404.CustomDatePropertEditroResigtrar"><property name="customDatePropertyEditor"><ref bean="customDatePropertyEditor"/></property>
</bean>
<bean id="customDatePropertyEditor" class="com.tom.springnote.chapter04.t0404.CustomDatePropertyEditor"><property name="datePattern" value="yyyy-MM-dd" />
</bean>
<bean id="customDateDto" class="com.tom.springnote.chapter04.t0404.CustomDateDto"><property name="date" value="2024-08-04" />
</bean>

在这里插入图片描述

【CustomDatePropertEditroResigtrar】自定义日期属性编辑器注册器

public class CustomDatePropertEditroResigtrar implements PropertyEditorRegistrar {private PropertyEditor customDatePropertyEditor;@Overridepublic void registerCustomEditors(PropertyEditorRegistry registry) {registry.registerCustomEditor(Date.class, getCustomDatePropertyEditor());}public PropertyEditor getCustomDatePropertyEditor() {return customDatePropertyEditor;}public void setCustomDatePropertyEditor(PropertyEditor customDatePropertyEditor) {this.customDatePropertyEditor = customDatePropertyEditor;}
}

【CustomDatePropertyEditor】自定义日期属性编辑器

public class CustomDatePropertyEditor extends PropertyEditorSupport {private String datePattern;@Overridepublic void setAsText(String text) throws IllegalArgumentException {try {setValue(new SimpleDateFormat(getDatePattern()).parse(text));} catch (ParseException e) {throw new RuntimeException(e);}}public String getDatePattern() {return datePattern;}public void setDatePattern(String datePattern) {this.datePattern = datePattern;}
}

【CustomDateDto】自定义dto (带date类型属性)

public class CustomDateDto {private Date date;public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "CustomDateDto{" +"date=" + date +'}';}
}

【打印日志】 (把字符串2024-08-04转换为 date类型属性)

CustomDateDto{date=Sun Aug 04 00:00:00 CST 2024}

相关文章:

spring01-spring容器启动过程分析

【README】 本文总结自《spring揭秘》&#xff0c;作者王福强&#xff0c;非常棒的一本书&#xff0c;墙裂推荐&#xff1b; spring容器根据配置元素组装可用系统分2个阶段&#xff0c;包括spring容器启动&#xff0c; springbean实例化阶段&#xff1b; 本文详细分析spring容…...

RAG与LLM原理及实践(12)--- Milvus RRFRanker的使用场景及源码分析

目录 背景 rrfRanker 简介与实例 核心逻辑 实例 蕴含思想 rrfRanker VS weightedRanker rrfRanker weightedRanker 场景使用区别 RRFRanker 使用场景 weightedRanker 使用场景 代码 代码实现 运行结果 修改代码 再次运行结果 源码 源码实现 解释 Ranker 可…...

Nginx与Tomcat的区别

Nginx与Tomcat的区别 —— 经验笔记 引言 在现代Web开发中&#xff0c;选择合适的服务器软件对于构建高性能、可靠的应用程序至关重要。Nginx 和 Tomcat 是两种常见的服务器软件&#xff0c;尽管它们都可以被归类为Web服务器&#xff0c;但它们的设计目标和应用场景有着本质的…...

LeetCode 3151.特殊数组 I

【LetMeFly】3151.特殊数组 I 力扣题目链接&#xff1a;https://leetcode.cn/problems/special-array-i/ 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 Aging 有一个整数数组 nums。如果 nums 是一个 特殊数组 &#xff…...

【产品那些事】The OX Active ASPM Platform

文章目录 前言关于OX Security产品理念 流程体验Complete Visibility&#xff1a;将安全无缝嵌入到SDLC中PBOMOSC&R coverageContextualized Prioritization&#xff1a;快速解决最关键的风险Accelerated Response&#xff1a;简化安全流程See Beyond the Code&#xff1a;…...

欢迪迈手机商城设计与开发

TOC springboot137欢迪迈手机商城设计与开发 绪论** 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0…...

Endnote与word关联 解决方案: COM加载项-----》CWYW插件安装

1、首先说一下本次情况&#xff0c;office的版本是2019&#xff0c;后安装的Endnote 9。旧版word也可按此方法尝试。 2、先找到关键的EndNote Cwyw.dll文件。应在此目录下&#xff1a;C:\Program Files (x86)\EndNote X7\Product-Support\CWYW。 3、如没有EndNote Cwyw.dll文…...

用R语言运用 Shiny 包打造基于鸢尾花数据集的交互式数据可视化应用

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 1章4节&#xff1a;数据可视化&#xff0c; R 语言的静态绘图和 Shiny 的交互可视化演…...

Upload-Lab第3关:如何巧妙应对黑名单文件后缀检测?

关卡介绍 在Pass03中,我们面临的挑战是绕过文件上传功能的黑名单检测机制。黑名单检测是一种常见的安全措施,它通过检查上传文件的后缀来阻止特定类型的文件(如 .php, .exe)被上传。在这一关,我们需要找到一种方法,上传一个可以执行的恶意文件,同时绕过黑名单检测。 …...

SSLVPN对比IPSECVPN安全设备的起源、发展、以及目前行业使用场景

前言 SSL VPN&#xff08;Secure Sockets Layer Virtual Private Network&#xff09;是一种利用SSL/TLS&#xff08;Transport Layer Security&#xff0c;传输层安全&#xff09;协议来创建安全连接的技术&#xff0c;它允许远程用户通过公共网络&#xff08;通常是互联网&am…...

Hadoop大数据集群搭建

一、虚拟机配置网络 1、配置文件 进入“/etc/sysconfig/network-scripts”目录&#xff0c;查看当前目录下的“ifcfg-ens33”文件 对“ens33”文件进行配置 2、重启网络 systemctl restart network 3、测试网络 Ping www.baidu.com 4、设置虚拟机主机名称 5、绑定主机名和…...

【技术前沿】MetaGPT入门安装部署——用多个大语言模型解决任务!一键安装,只需填写OpenAI API

项目简介 MetaGPT 是一个多智能体框架&#xff0c;旨在构建全球首家 “AI 软件公司”。该项目通过为 GPT 分配不同的角色&#xff0c;模拟产品经理、架构师、工程师等职业&#xff0c;协同完成复杂的软件开发任务。MetaGPT 将一个简单的需求转化为完整的软件开发流程&#xff…...

#compsoer基本使用01#

Composer 是 PHP 的依赖管理工具&#xff0c;它允许开发人员管理和安装项目所需的依赖包。 1:查看Compsoer的全局配置命令 composer config -g --list --verbose 这个可以查看composer的镜像地址。例如 [repositories.packagist.org] type (string) : composer [repositor…...

基于c++的yolov5推理之前处理详解及代码(一)

目录 一、前言&#xff1a; 二、关于环境安装&#xff1a; 三、首先记录下自己的几个问题 问题&#xff1a;c部署和python部署的区别&#xff1f; 四、正文开始 4.1 图像预处理讲解 1、BGR---->RBG 2、等比例放缩图片&#xff08;涉及到短边的填充&#xff09; 3、归一化…...

Oracle(55)什么是并行查询(Parallel Query)?

并行查询&#xff08;Parallel Query&#xff09;是数据库管理系统中的一种查询优化技术&#xff0c;它允许数据库引擎同时使用多个处理器或线程来执行查询操作。通过将查询任务分解为多个子任务&#xff0c;并在多个处理器上同时执行这些子任务&#xff0c;可以显著提高查询的…...

关于 Lora中 Chirp Spread Spectrum(CSS)调制解调、发射接收以及同步估计的分析

本文结合相关论文对CSS信号的数学形式、调制解调、发射接收以及同步估计做了全面分析&#xff0c;希望有助于更好地理解lora信号 long-range (LoRa) modulation, also known as chirp spread spectrum (CSS) modulation, in LoRaWAN to ensure robust transmission over long d…...

Java - API

API全称"Application Programming Interface"&#xff0c;指应用程序编程接口 API&#xff08;JDK17.0&#xff09;链接如下 : Overview (Java SE 17 & JDK 17) (oracle.com)https://docs.oracle.com/en/java/javase/17/docs/api/中文版&#xff1a; Java17中…...

力扣 3152. 特殊数字Ⅱ

题目描述 queries二维数组是nums数组待判断的索引区间&#xff08;左闭右闭&#xff09;。需要判断每个索引区间中的nums相邻元素奇偶性是否不同&#xff0c;如果都不同则该索引区间的搜索结果为True&#xff0c;否则为False。 暴力推演&#xff1a;也是我最开始的思路 遍历q…...

识别和缓解软件安全威胁的最佳工具

软件安全威胁会给企业带来重大损失&#xff0c;从经济损失到声誉受损。 企业必须主动识别和缓解这些威胁&#xff0c;防止它们造成危害。 幸运的是&#xff0c;有许多工具可以帮助企业识别和缓解软件安全威胁。 在本博客中&#xff0c;我们将探讨识别和缓解软件安全威胁的顶…...

Linux下的压缩与解压:掌握核心命令行工具

目录 一.前言 二.压缩文件概述 三.tar&#xff1a;Linux 的通用归档工具 常用 tar 命令 四.gzip&#xff1a;强大的压缩程序 常用 gzip 命令 五.zip 和 unzip&#xff1a;处理 ZIP 压缩文件 常用 zip 和 unzip 命令 实用技巧和最佳实践 六.结语 一.前言 在 Linux …...

BGP选路实验

要求&#xff1a; 1.如图连接网络&#xff0c;合理规格IP地址&#xff0c;AS200内IGP协议为OSPF&#xff1b; 2.R1属于AS 100&#xff1b;R2-R3-R4小AS234、R5-R6-R7小AS567&#xff0c;同时声明大AS 200&#xff0c;R8属于AS300&#xff1b; 3.R2-R5、R4-R7之间为联邦EBGP邻居…...

白骑士的C#教学高级篇 3.3 网络编程

网络编程是现代应用程序开发中至关重要的一部分。C# 提供了一套丰富的 API 来处理基本网络通信、Web请求与响应。在本节中&#xff0c;我们将深入探讨这些内容&#xff0c;帮助您掌握如何在 C# 中进行网络编程。 基本网络通信 基本网络通信通常涉及套接字&#xff08;Socket&a…...

AI大模型赋能游戏:更智能、更个性化的NPC

参考论文&#xff1a;https://arxiv.org/abs/2403.10249 在传统游戏中&#xff0c;NPC&#xff08;非玩家角色&#xff09;的行为往往是预先设定好的&#xff0c;缺乏灵活性和变化性。然而&#xff0c;基于大模型的NPC可以利用其强大的推理和学习能力&#xff0c;实时生成对话…...

pymysql的上下文管理器:简化数据库操作

pymysql的上下文管理器&#xff1a;简化数据库操作 当我们使用 pymysql 操作数据库时&#xff0c;管理数据库连接和游标的生命周期是一项重要的任务。Python 的上下文管理器提供了一种优雅的方式来处理资源的获取和释放。在本文中&#xff0c;我们将探索如何创建一个简单的 py…...

AI秘境-墨小黑奇遇记 - 修炼成神经(二)

在解开了感知机和门电路的谜题后&#xff0c;墨小黑对人工智能的世界渐渐产生了浓厚的兴趣。他开始意识到&#xff0c;自己不仅是在学习一门复杂的技术&#xff0c;更是在探索一个充满未知与挑战的神秘领域。 入夜&#xff0c;墨小黑一脸无奈地盯着电脑屏幕&#xff0c;思考着自…...

计算机网络之分组交换时延的计算

一.类型 分组交换的时延包括一下几种&#xff1a; 1.1发送时延 发送时延&#xff0c;也叫传输时延&#xff0c;结点将分组的所有比特推向链路所需要的时间&#xff0c;即从发送分组的第一个比特算起&#xff0c;到该分组的最后一个比特发送完为止。 发送时延 分组长度 / 发…...

虚幻5|入门AI行为树,建立敌人

本章分成两块部分一块是第一点的制作一个简单的AI&#xff0c;后面第二点之后是第二部分建立ai行为树。这两个部分是一个衔接&#xff0c;最好不要跳看 一&#xff0c;制作一个简单的AI 1.首先&#xff0c;我们创建一个敌人的角色蓝图&#xff0c;添加一个场景组件widget用于…...

ARM处理架构中的PMU(Performance Monitoring Unit)和 AMU(Activity Monitors Unit)简介

在 ARM 架构中,PMU(Performance Monitoring Unit)和 AMU(Activity Monitors Unit)是用于性能分析和监控的硬件单元,但它们的功能和应用场景有所不同。以下是它们的主要区别: 1. PMU (Performance Monitoring Unit) 功能:PMU 是一种用于监控处理器性能的硬件单元。它可…...

Service服务在Android中的使用

目录 一&#xff0c;Service简介 二&#xff0c;Service的两种启动方式 1&#xff0c;非绑定式启动Service 2&#xff0c;绑定式启动Service 三&#xff0c;Service的生命周期 1&#xff0c;非绑定式Service的生命周期 2&#xff0c;绑定式Service的生命周期 四&#xf…...

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段&#xff0c;C语言允许在一个结构体中以位为单位来指定其成员所占内存长度&#xff0c;这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下&#xff0c;我们均在VS2022的…...

wordpress 前台加载慢/百度一下知道首页

1 Service Kubernetes Pods 是有生命周期的。他们会被创建&#xff0c;被销毁&#xff0c;但是他们不会无条件"复活"。比如 ReplicaSets 这种 Pod 控制器会动态生成或者销毁 Pods&#xff08;如在扩容或者缩容时&#xff09;。当然每个Pod 都会自动被 k8s 分配IP地址…...

网站建设怎么挣钱/18款免费软件app下载

计算机c语言期末考试卷二.doc下载提示(请认真阅读)1.请仔细阅读文档&#xff0c;确保文档完整性&#xff0c;对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档&#xff0c;不会出现我们的网址水印。3、该文档所得收入(下载内容预览)归上传者、原创作者&a…...

网站开发需要考虑哪些方面/seo人才网

json-server获取服务器数据只能用get方式&#xff0c;而express支持post方式获取数据 express 一般项目中均安装&#xff0c;若未安装 npm install express --savebuild文件夹webpack.dev.config.js添加设置 //支持post mock数据 var express require(express); //启动expr…...

龙岗做商城网站建设/谷歌网页版登录入口

1.杭州 阿里&#xff0c;网易&#xff0c;京东网银&#xff0c;百度钱包&#xff0c;蘑菇街&#xff0c;丁香园 2 北京 360&#xff0c;美团转载于:https://www.cnblogs.com/dan-cnblogs/p/4700996.html...

深圳知名网站建设公司/北京搜索引擎优化管理专员

一、题目描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设…...

沈阳做网站有名公司/热搜关键词查询

文章目录一、App应用配置总结1.app应用一、App应用配置 在每个应用目录中都包含了apps.py文件&#xff0c;用于保存该应用的相关信息。 在创建应用时&#xff0c;Django会向apps.py文件中写入一个该应用的配置类&#xff0c;如 from django.apps import AppConfigclass Book…...