学习日记-spring-day37-6.25

知识点:

1.使用utillist进行配置

知识点

核心内容

重点

Spring框架中utl名称空间创建List

通过utl名称空间创建并管理集合对象,实现数据复用

utl list与普通list赋值的区别; 名称空间引入方法

无参构造器使用规则

当类中没有其他构造器时,默认无参构造器可不写;若有其他构造器则必须显式定义无参构造器

构造器覆盖机制; 显式定义的必要性

XML名称空间引入

使用alt+enter自动引入或手动添加xmlns:util声明

工具兼容性问题处理; schema location配置

集合属性注入

通过<util:list>定义共享集合,使用ref属性引用

数据复用实现方式; value与ref的使用场景

BookStore案例演示

包含bookList属性的类配置,展示集合注入的两种实现方式

XML配置语法对比; 运行时验证方法

2.属性级联赋值配置

知识点

核心内容

重点

级联属性赋值

通过Spring IOC容器直接对对象属性的属性赋值(如employee.department.name)

配置语法:<property name="department.name" value="JAVA开发部门"/>

对象关联配置

在配置主对象(如employee)时引用关联对象(如department)并级联赋值

底层原理:调用关联对象的setter方法

(如department.setName())

XML配置示例

演示employee与department的级联配置,动态设置部门名称

易错点:需确保关联对象已实例化且属性可访问(如department需有无参构造器)

测试验证

通过输出employee对象验证级联赋值结果(如部门名称显示为JAVA开发部门)

关键代码:employee.getDepartment().getName()

3.通过静态工厂获取Bean

知识点

核心内容

重点

静态工厂模式

通过工厂类返回指定对象,替代直接配置方式

工厂类与普通Bean配置的区别

静态代码块特性

类加载时执行且只执行一次,用于初始化

静态代码块与普通代码块执行时机差异

工厂方法配置

class属性需指定工厂类全路径,factory-method指定方法

容易混淆普通Bean配置的class属性用法

对象获取机制

通过constructor-arg指定工厂内具体对象key

多对象管理时key的匹配规则

单例验证

同一ID多次获取为同一对象(静态工厂特性)

与原型模式(prototype)的作用域区别

4.通过实例工厂获取Bean

知识点

核心内容

重点

静态工厂与实例工厂的区别

静态工厂通过类直接调用静态方法获取对象,无需实例化工厂类;实例工厂需先创建工厂实例,再通过实例方法获取对象

静态工厂方法为static,实例工厂方法需依赖对象调用

实例工厂配置流程

1. 配置实例工厂Bean

2. 在目标Bean中通过factory-bean指定工厂实例

3. 通过factory-method指定方法

4. 用constructor-arg传递参数

必须显式配置工厂实例Bean

对象作用域对比

静态工厂返回的对象始终为同一实例(单例);实例工厂根据工厂实例不同可能返回不同对象

实例工厂的对象作用域与工厂实例绑定

配置示例代码

xml <bean id="myInstanceFactory" class="com.factory.MyInstanceFactory"/> <bean id="monster02" factory-bean="myInstanceFactory" factory-method="getMonster"> <constructor-arg value="monster03"/> </bean>

factory-bean与factory-method需配对使用

关键验证逻辑

同一实例工厂多次调用返回相同对象;不同实例工厂返回不同对象(即使参数相同)

对象一致性取决于工厂实例而非配置ID

5.通过FactoryBean获取Bean

知识点

核心内容

重点

Factory Bean机制

通过实现FactoryBean接口创建工厂Bean,可定制对象创建逻辑

getObject()与getObjectType()方法必须重写

泛型指定

FactoryBean需指定泛型类型决定生产对象类型

泛型类型与实际返回对象类型必须匹配

单例控制

isSingleton()方法决定返回对象是否为单例

默认false(原型模式),需显式设置为true

对象获取流程

1. 配置class为FactoryBean全类名;

2. 通过property指定key值;

3. 容器调用getObject()返回目标对象

class属性配置的是工厂Bean而非目标Bean

Map结构存储

使用HashMap预存多个对象实例

key-value需与配置的property严格对应

配置示例

xml<bean id="myMonster05" class="com.MyFactoryBean"><property name="k" value="monster04"/>

k属性对应工厂Bean的setK()方法

6.Bean配置信息重用

知识点

核心内容

重点

Spring IOC容器继承机制

通过parent属性实现bean配置信息重用,避免重复配置相同属性

parent属性引用方式 vs 直接复制配置

抽象bean配置

通过abstract="true"声明仅供继承的模板bean,类似Java抽象类

抽象bean不可实例化 vs 普通bean可实例化

属性继承验证

子bean自动继承父bean所有属性值(如monster11继承monster10)

继承后属性覆盖规则需注意

配置复用场景

适用于多bean共享相同基础属性的场景(如多个monster对象)

属性继承 vs 对象组合的选择

异常处理案例

尝试实例化抽象bean会抛出BeanIsAbstractException

抽象bean仅作为配置模板的设计意义

7.Bean创建顺序(1)

知识点

核心内容

重点

Spring IOC容器中Bean的默认创建顺序

默认按照XML/配置文件的书写顺序从上到下创建Bean对象

配置顺序决定初始化顺序,无依赖关系时严格按代码先后执行

depends-on属性强制改变创建顺序

通过depends-on="targetBeanId"显式声明依赖关系,优先初始化被依赖的Bean

即使被依赖的Bean配置在后方,仍会逆向触发初始化

依赖关系的实际应用场景

班级(Class)需先于学生(Student)创建,确保引用有效性

业务逻辑中存在强依赖时必须使用depends-on

验证方法(构造器输出日志)

在无参构造器中打印日志,通过控制台输出观察Bean初始化顺序

构造器执行顺序=Bean创建顺序,需注意日志干扰项

8.Bean创建顺序(2)

知识点

核心内容

重点

Spring IOC容器中bean的创建顺序

1. 默认按配置顺序创建bean;

2. 引用关系的处理是最后阶段完成;

3. 容器会将所有bean先实例化再处理依赖

配置顺序≠依赖解析顺序; 即使被引用的bean后配置也不会导致空引用

依赖注入的时序问题

1. 容器采用两阶段处理

- 第一阶段:实例化所有bean; - 第二阶段:处理属性注入;

2. 通过BeanDefinitionMap维护依赖关系

初学者容易误解为"配置在前面的bean会先被完整初始化"

构造器与setter方法的执行时机

1. 构造器在bean实例化阶段执行;

2. setter方法在依赖注入阶段执行;

3. 实验验证: - 构造器输出先于setter方法

构造器注入setter注入的时序差异

配置顺序灵活性

1. bean配置顺序可任意调整;

2. 不依赖depends-on也能正确处理循环依赖;

3. 底层通过三级缓存解决依赖循环

与传统的new对象方式有本质区别

IOC容器的整体性思维

1. 容器将所有bean定义作为整体处理;

2. 采用图论算法解析依赖关系;

3. 最终保证所有依赖关系正确建立

理解"容器即工厂"的设计哲学

9.Bean的单例和多实例(1)

知识点

核心内容

重点

Spring IOC容器的单例与多例

默认情况下,Spring IOC容器按单例模式创建bean对象,即整个容器中只有一个实例;通过scope="prototype"可配置为多例模式,每次getBean()返回新对象。

单例与多例的配置区别:singleton(默认)vs prototype;单例对象的生命周期与容器一致,多例对象每次独立创建。

单例模式的实际表现

单例模式下,多次调用getBean()返回同一对象(通过哈希值验证)。

需注意单例对象的线程安全问题及状态管理。

多例模式的实际表现

配置scope="prototype"后,每次getBean()触发构造器执行,返回新对象(哈希值不同)。

多例适用于需要隔离状态的场景,但需注意资源开销。

代码演示与验证

通过Cat类构造器输出验证单例/多例效果:单例模式仅输出一次构造信息,多例模式每次调用均输出。

易混淆点:属性相同≠对象相同(多例模式下属性值相同但对象不同)。

scope属性的语义

scope直译为“范围”,单例(singleton)即容器范围内唯一,多例(prototype)即每次获取均为原型的新实例。

需理解prototype的原型设计模式背景。

10.Bean的单例和多实例(2)

知识点

核心内容

重点

单例模式默认行为

默认在启动容器时创建单例对象,根本原因并非因为是单例,而是lazy-init默认值为false

单例≠必然提前创建,需结合lazy-init属性判断

prototype多例机制

配置scope=prototype后,对象在getBean时才会创建,每次调用生成新实例

多例对象不存入单例池,创建时机与单例模式本质差异

懒加载配置

单例模式下设置lazy-init=true会延迟创建,首次getBean时才初始化

懒加载仅影响创建时机,不影响单例性质(后续调用仍取同一实例)

prototype与懒加载关系

多例模式下lazy-init属性无效(无论true/false均在getBean时创建)

需特别注意多例模式天然具有"懒加载"特性

单例模式设计权衡

默认非懒加载单例以空间换时间,提前创建可能未使用的对象但提升获取效率

特殊场景(如事务管理)才需要配置懒加载

11.Bean的生命周期

知识点

核心内容

重点

Bean生命周期

构造器→set方法→init方法→使用→destroy方法

执行顺序配置方式是关键

构造器执行时机

JVM创建对象后首先执行构造器

构造器调用时对象已在堆内存存在

属性注入机制

通过set方法完成属性赋值

必须提供set方法才能注入

init方法配置

在bean标签通过init-method指定

方法名可自定义,需在配置中声明

destroy方法触发

容器关闭时自动调用

必须显式关闭容器才会触发

接口编程实践

ConfigurableApplicationContext提供close方法

接口引用实现类方法的访问问题

生命周期图示

构造→注入→初始化→使用→销毁

set方法执行后才调用init方法

方法执行控制权

init/destroy方法由Spring容器控制时机

程序员只负责编写逻辑配置声明

12.配置Bean后置处理器(1)

知识点

核心内容

重点

bin生命周期

初始化方法和销毁方法的调用时机与作用

初始化方法在容器启动时调用,销毁方法在容器关闭时调用

bin后置处理器

在初始化方法前后调用的特殊对象,可对bin进行修改处理

postProcessBeforeInitialization和postProcessAfterInitialization的区别

后置处理器实现

需实现BeanPostProcessor接口并重写两个关键方法

方法参数中object bean和beanName的含义与用途

后置处理器调用时机

在bin的init方法前后分别调用对应方法

与setter方法执行顺序的关系

AOP概念引入

后置处理器是理解AOP(面向切面编程)的基础

后置处理器与切面编程的关联性

实践验证方法

通过输出日志验证后置处理器的调用流程

如何观察bin对象在处理器中的状态变化

13.配置Bean后置处理器(2)

知识点

核心内容

重点

后置处理器配置

演示如何通过新建容器配置文件配置后置处理器,避免日志过多干扰

后置处理器必须实现特定接口才能生效

后置处理器触发时机

在初始化方法之前(postProcessBeforeInitialization)和之后(postProcessAfterInitialization)触发

注意后置处理器未配置时不会触发任何方法

对象生命周期

完整展示对象创建流程:构造器→set方法→初始化方法→使用→销毁方法

初始化与销毁方法的配置方式

容器隔离性

不同配置文件(beans/beans02.xml)创建的容器相互独立

后置处理器只对所在容器的对象生效

后置处理器作用范围

配置后会自动作用于容器内所有对象

注意处理器方法中接收的对象是同一个实例(通过哈希值验证)

调试技巧

通过新建干净配置文件简化调试,使用toString输出对象状态

关键点:处理器方法执行时对象已完成属性注入但未初始化

14.配置Bean后置处理器(3)

知识点

核心内容

重点

后置处理器执行机制

底层通过AOP机制实现,依赖反射+动态代理

方法触发原理(切面编织)与普通方法调用的区别

后置处理器作用范围

对IOC容器中所有对象生效(如house、monster等)

作用对象是否包含懒加载实例(仅非懒加载生效)

应用场景

统一处理日志、权限校验、安全验证、事务管理

与单一对象处理的代码差异(切面编程范式)

动态修改案例

通过instanceof判断类型,强制将house对象名称改为“上海豪宅”

运行期修改与配置期修改的优先级冲突

底层实现预告

后续将手动实现反射+代理+容器+注解机制

AOP与IOC容器的耦合关系

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

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

相关文章

【Python练习】012. 使用字符串的upper()方法将字符串转换为大写

012. 使用字符串的upper方法将字符串转换为大写 012. 使用字符串的upper()方法将字符串转换为大写示例代码运行结果代码解释 扩展&#xff1a;动态输入字符串示例运行 何时使用upper方法基本用法示例忽略大小写的字符串比较数据清洗标准化 注意事项 012. 使用字符串的upper()方…

Python Polars库详解:高性能数据处理的新标杆

在数据驱动的时代&#xff0c;高效的数据处理能力已成为开发者和数据科学家的核心竞争力。作为Pandas的强劲挑战者&#xff0c;Polars库凭借其基于Rust的底层架构和创新的表达式引擎&#xff0c;在性能测试中展现出惊人的速度优势。本文将深入解析Polars的核心特性、使用技巧及…

Go语言- 单元测试

实际开发中&#xff0c;需要保证单元功能正确。 传统方式&#xff1a;在main函数中直接调用&#xff0c;查看结合是否和预期一致。 缺点&#xff1a;1. 不方便 2. 不利于管理 因此&#xff0c;单元测试具有必要性 testing测试框架 Go语言中自带testing轻量级测试框架和go…

Vue移动端开发的适配方案与性能优化技巧

文章目录 1. 移动端适配方案1.1. 视口适配1.2. 基于rem/em的适配方案1.3. vw/vh视口单位适配1.4. 移动端UI组件库适配 2. 移动端性能优化技巧2.1. 虚拟列表实现长列表优化2.2. 图片懒加载与优化2.3. 减少首屏加载时间2.4. 事件节流与防抖 3. 移动端常见问题解决方案3.1. 移动端…

如何微调和部署OpenVLA在机器人平台上

这个教程来自这个英伟达网址 教程的目标是提供用于部署 VLA 模型的优化量化和推理方法&#xff0c;以及针对新机器人、任务和环境的参考微调流程。在一个自包含的仿真环境中&#xff0c;结合场景生成和领域随机化&#xff08;MimicGen&#xff09;对性能和准确性进行严格验证。…

深入剖析Flink内存管理:架构、调优与实战指南

在大数据处理领域&#xff0c;Apache Flink凭借强大的流处理和批处理能力备受青睐。而Flink内存管理机制&#xff0c;作为保障作业高效稳定运行的关键支柱&#xff0c;深刻影响着任务执行性能、资源利用率以及系统容错能力。理解并掌握Flink内存管理原理与优化策略&#xff0c;…

【力扣 C】动态规划专题目录

【力扣 简单 C】509. 斐波那契数https://blog.csdn.net/2503_92320911/article/details/148810148 【力扣 中等 C】983. 最低票价https://blog.csdn.net/2503_92320911/article/details/148833421 【力扣 中等 C】91. 解码方法https://blog.csdn.net/2503_92320911/article/d…

Linux 中如果网络连接丢失或无法找到网络设备

如下步骤 1. 检查网络服务状态 sudo systemctl status NetworkManager 如果服务未运行&#xff0c;启动并启用它&#xff1a; sudo systemctl start NetworkManager sudo systemctl enable NetworkManager ______ 2. 检查网络接口 ip add 确认网卡&#xff08;如 eth0、en…

【Linux 平台总线驱动开发实战】

Linux 平台总线驱动开发实战 一、平台总线驱动基础概念二、核心数据结构解析2.1 设备结构体 struct platform_device2.2 驱动结构体 struct platform_driver2.3 资源结构体 struct resource 三、驱动开发完整流程3.1 设备注册3.2 驱动注册3.3 设备与驱动匹配 四、编译与测试4.1…

LabVIEW液位上升图像识别 附件有源码

源程序在这里https://www.bjcyck.com/nd.jsp?fromColId101&id2675#_np101_331 本LabVIEW 程序实现基于图像灰度特征的液位上升监测与控制&#xff0c;通过读取序列液位上升图像&#xff0c;分析指定区域灰度变化获取液位斜率&#xff0c;依据设定标记位置实现液位上升到目…

git安装使用详细教程

git高速下载 macOS 系统 # 方法1&#xff1a;Homebrew&#xff08;推荐&#xff09; brew install git# 方法2&#xff1a;官方安装包 下载地址&#xff1a;https://sourceforge.net/projects/git-osx-installer/Linux 系统 # Debian/Ubuntu sudo apt update && sudo…

玛哈特机械矫平机:精密制造的“应力消除师”与“平整度雕刻家”

机械矫平机&#xff0c;作为金属板材加工链中的关键一环&#xff0c;其价值远不止于“压平”那么简单。它是材料科学、精密机械与控制技术的结晶&#xff0c;是确保高端制造品质的幕后功臣。本文将深入探讨其核心机理、进阶应用及未来方向。 一、 矫平机理再探&#xff1a;超越…

四色(定理/猜想)染色算法小软件Version1.11 2025.6.24 开发者:孝感动天/卧冰求鲤

四色(定理/猜想)染色算法小软件Version1.11 2025.6.24 开发者&#xff1a;孝感动天/卧冰求鲤 开发者&#xff1a;路人甲/打酱油 开发者&#xff1a;四色定要治理/四邻不安/相邻必反/草木皆兵/围棋紧箍/不是我~干的/和我无关 开发者&#xff1a;不是我/不是我干的&#xff0c…

SQL 分页方法全解析:从基础到高级应用

一、引言 在 Web 应用和数据分析中&#xff0c;分页是处理大量数据的必备功能。想象一下&#xff0c;如果没有分页&#xff0c;社交媒体的动态流、电商平台的商品列表都将变成无穷无尽的长页面&#xff0c;用户体验和系统性能都会受到严重影响。本文将深入探讨 SQL 中各种分页方…

STM32 adc采集数据存到SD卡中

F1板子实现adc采集模拟信号存储到SD卡中 STM32 adc采集数据存到SD卡中/STM32SD文件系统ADC采集/AD/adc_dma.c , 10291 STM32 adc采集数据存到SD卡中/STM32SD文件系统ADC采集/AD/adc_dma.h , 661 STM32 adc采集数据存到SD卡中/STM32SD文件系统ADC采集/CMSIS/core_cm3.c , 17273…

redis8.0新特性:布谷鸟过滤器(Cuckoo Filter)详解

文章目录 一、写在前面二、使用1、CF.RESERVE 创建布谷鸟过滤器2、CF.ADD 添加元素3、CF.ADDNX 不存在才添加4、CF.COUNT 判断元素添加次数5、CF.DEL 删除一次元素6、CF.EXISTS 判断元素是否存在7、CF.MEXISTS 批量判断元素是否存在8、CF.INFO 查看布谷鸟过滤器信息9、CF.INSER…

2025 Java秋招『面试避坑指南』:牛客网高频题分类精讲

前言 今天为大家整理了目前互联网出现率最高的大厂面试题&#xff0c;所谓八股文也就是指文章的八个部分&#xff0c;文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成&#xff0c;题目一律出自四书五经中的原文。 初中级和中高级都有&#xff0c…

git安装使用和git命令大全

Git高速下载 程序员面试资料大全&#xff5c;各种技术书籍等资料-1000G Git 命令大全 一、基础操作 1. 初始化与克隆 命令说明示例git init初始化本地仓库git initgit clone克隆远程仓库git clone https://github.com/user/repo.gitgit remote add添加远程仓库git remote ad…

非常好用的markdown转pdf工具

在文档处理和知识管理中&#xff0c;Markdown因其简洁易读的特性而广受欢迎&#xff0c;而PDF格式则因其广泛的兼容性和稳定性而被广泛用于文档分享和存档。然而&#xff0c;将Markdown文档高效地转换为PDF格式&#xff0c;同时保留格式和样式&#xff0c;一直是许多用户的需求…

八股文——JAVA基础:基本数据类型与包装类的区别

基本数据类型包含八种&#xff0c; 1.用途不同&#xff0c;在目前编程而言&#xff0c;基本除了使用局部变量会使用基本数据类型外&#xff0c;都会去使用包装类。包装类能够适用泛型是目前企业编程使用包装类的主要原因&#xff0c;而基本类型不行。除此之外&#xff0c;包装…