SpringBean的生命周期
SpringBean的生命周期
- SperingBean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段
- Bean的实例化阶段:Spring框架会取出BeanDefiniton的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射(加载类)进行实例化
- Bean的初始化阶段(着重研究):Bean创建之后还仅仅是个半成品,还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法,执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具有技术含量和复杂程度的阶段,AOP增强功能,后面学习的Spring的注解功能等、spring高频面试题Bean的循环引用问题都是在这个阶段体现的
- Bean的完成阶段:经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池singletonObjects中,即完成了Spring Bean的整个生命周期。
Spring Bean的初始化阶段涉及过程
- Bean实例属性的填充
- Aware接口属性的注入
- BeanPostProcessor的before()方法回调
- InitializingBean接口的初始化方法回调
- 自定义初始化方法init回调
- BeanPostProcessor的after()方法回调
Bean实例属性填充
- BeanDefinition中对当前Bean实体的注入信息通过属性propertyValue进行了储存,例如UserService的属性信息如下

-
<bean id="userService" class="com.example.Service.Impl.UserServiceImpl"><property name="userDAO" ref="userDAO"></property><property name="name" value="hhhh"></property></bean><bean name="userDAO" class="com.example.DAO.Impl.UserDAOImpl"></bean>
属性注入的三种情况
- 注入普通属性,String,int或存储基本类型的集合时,直接通过set方法反射设置进去
- 上述属性name对应类中的set方法

- 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,再进行注入操作
- 上述UserDAO属性的注入
- 根据配置文件中bean的位置不同,进行的顺序也不一样
- 主要代码如下
- UserServiceImpl类
-
package com.example.Service.Impl;import com.example.DAO.UserDAO; import com.example.Service.UserService;public class UserServiceImpl implements UserService {public UserServiceImpl() {System.out.println("UserService对象创建");}private UserDAO userDAO;private String name;public void setName(String name) {this.name = name;}public void setUserDAO(UserDAO userDAO) {System.out.println("UserService执行注入UserDAO的操作:setDAO方法");this.userDAO = userDAO;}@Overridepublic void show() {System.out.println("show~~~");} } -
UserDAOImpl类
-
package com.example.DAO.Impl;import com.example.DAO.UserDAO;public class UserDAOImpl implements UserDAO {public UserDAOImpl() {System.out.println("UserDAO对象创建");} } -
测试类
-
package com.example.Test;import com.example.Service.UserService; import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestApplicationContext {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");UserService UserServiceBean = (UserService) context.getBean(UserService.class);} }
-
若配置文件中先创建UserADO的bean对象
-
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.example.PostProcessor.TimeLogBeanPostProcessor"></bean><!-- <bean id="userService" class="com.example.Service.Impl.UserServiceImpl">--><!-- </bean>--><!-- <bean id="userDAO" class="com.example.DAO.Impl.UserDAOImpl">--><!-- </bean>--><!-- <alias name="userDAO" alias="xxx"/>--><!-- <alias name="userDAO" alias="yyy"/>--><bean name="userDAO" class="com.example.DAO.Impl.UserDAOImpl"></bean><bean id="userService" class="com.example.Service.Impl.UserServiceImpl"><property name="userDAO" ref="userDAO"></property><property name="name" value="hhhh"></property></bean></beans> -
测试类运行结果为
-

-
若配置文件中先创建UserService的bean对象
-
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.example.PostProcessor.TimeLogBeanPostProcessor"></bean><!-- <bean id="userService" class="com.example.Service.Impl.UserServiceImpl">--><!-- </bean>--><!-- <bean id="userDAO" class="com.example.DAO.Impl.UserDAOImpl">--><!-- </bean>--><!-- <alias name="userDAO" alias="xxx"/>--><!-- <alias name="userDAO" alias="yyy"/>--><bean id="userService" class="com.example.Service.Impl.UserServiceImpl"><property name="userDAO" ref="userDAO"></property><property name="name" value="hhhh"></property></bean><bean name="userDAO" class="com.example.DAO.Impl.UserDAOImpl"></bean></beans> -
运行结果如下
-

- 注入双向对象引用属性时,就比较复杂了,涉及循环引用(循环依赖)问题,下面会详细阐释解决方案。(明天再来,女朋友来了,不能学习了p51)
相关文章:
SpringBean的生命周期
SpringBean的生命周期 SperingBean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段 Bean的…...
uni-app 之 picker选择器
uni-app 之 picker选择器 同步滚动:开 uni-app 之 picker选择器 一、普通选择器 二、多列选择器 三、时间选择器 四、日期选择器 一、普通选择器 <template><view><picker change"bindPickerChange" :value"index" :range&q…...
整合车辆出险报告Api接口,轻松管理车险理赔!
随着车辆保有量的不断增加,车辆出险的情况也越来越普遍。对于车主来说,如何高效地管理车险理赔,处理保险事故是非常重要的。这时候我们就可以借助整合车辆出险报告API接口,实现快速定位理赔信息,轻松管理车险理赔。 一…...
eNSP基础网络学习-v02
一、eNSP 1.什么是eNSP eNSP(Enterprise Network Simulation Platform)是一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台,主要对企业网络路由器、交换机进行软件仿真,完美呈现真实设备实景,支持大型网络模拟,让…...
mac环境安装多个node版本(可切换)
出现问题 mac m1pro版(前段时间刚换的),环境安装的都是最新的。node 18.17.1 前端跑的是react 18 的项目(antD), 又跑了一个相对环境配置比较低的项目,然后启动不起来了; 分析控制台报错,推断是…...
Linux 操作技巧
目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳,命令解释器,负责解析用户输入的命令 ——内置命令(shell内置) ——外置命令,在文件系统的某个目录下&…...
一个电子信息工程学生的历程和内心感想
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、我对大学三年专业课程的理解二、我为什么本科选择研究嵌入式这个方向?1.可以把理论变为实际应用——兴趣是最好的老师。2.嵌入式方向可以打的比赛非…...
【zookeeper】zk集群安装与启动踩坑点
zk安装我也踩了一些坑。特别是第一点,zk官网好像都没什么说明,导致直接下错了,搞了好几个小时。 踩坑点如下: 1,在zk官网下载包时,注意3.5以后的版本,要下载带-bin的,3.5之后&…...
【计算机网络】 拥塞控制
文章目录 背景TCP的四种拥塞控制算法慢开始与拥塞避免:快重传:快恢复: 流量控制和拥塞控制本质上的 区别 背景 网络中的链路容量和交换节点中的缓存和处理机都有着工作的极限,当网络的需求超过他们的工作极限时,就出现…...
【react】慎用useLayoutEffect转而使用useEffect
由于useLayoutEffect钩子是在dom获得后、渲染组件前。因此,如果在useLayoutEffect中设置一些长耗时的,或者死循环之类的任务,会导致内存堆栈溢出。这时候需要转用useEffect。 // 适配全局宽度拉动变化时,legend显示数量React.use…...
基于微信小程序的美食推荐系统设计与实现(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
laravel框架 - 消息队列如何使用
业务场景:项目里边有很多视频资源需要上传到抖音资源库,通过队列一条一条上传。 参考实例:发送邮件,仅供参考 (1)创建任务【生成任务类】 在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存…...
Dependency ‘org.redisson:redisson:‘ not found解决方法 三种刷新Maven项目的方法
报错情况 在pom中导入redisson包 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId> </dependency> 爆红,还显示Dependency org.redisson:redisson: not found。 由于报错已经解决,…...
Mysql高级——索引优化和查询优化(1)
索引优化 1. 数据准备 学员表插50万条, 班级表插1万条。 建表 CREATE TABLE class (id INT ( 11 ) NOT NULL AUTO_INCREMENT,className VARCHAR ( 30 ) DEFAULT NULL,address VARCHAR ( 40 ) DEFAULT NULL,monitor INT NULL,PRIMARY KEY ( id ) ) ENGINE INNO…...
Oracle for Windows安装和配置——Oracle for Windows数据库创建及测试
2.2. Oracle for Windows数据库创建及测试 2.2.1. 创建数据库 1)启动数据库创建助手(DBCA) 进入%ORACLE_HOME%\bin\目录并找到“dbca”批处理程序,双击该程序。具体如图2.1.3-1所示。 图2.1.3-1 双击“%ORACLE_HOME%\bin\dbca”…...
【1993. 树上的操作】
来源:力扣(LeetCode) 描述: 给你一棵 n 个节点的树,编号从 0 到 n - 1 ,以父节点数组 parent 的形式给出,其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点,所以 par…...
LeetCode【1. 两数之和】
穷通有命无须卜,富贵何时乃济贫;角逐名场今已久,依然一幅旧儒巾。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输…...
3D成像技术概述
工业4.0时代,三维机器视觉备受关注,目前,三维机器视觉成像方法主要分为光学成像法和非光学成像法,这之中,光学成像法是市场主流。 飞行时间3D成像 飞行时间成像(Time of Flight),简称TOF,是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉…...
Centos7 安装部署 Kubernetes(k8s) 高可用集群
1:基础环境准备 宿主机系统集群角色服务器IP主机名称容器centos7.6master192.168.2.150ks-m1dockercentos7.6master192.168.2.151ks-n1dockercentos7.6master192.168.2.152ks-n2docker 1.1 服务器初始化及网络配置 VMware安装Centos7并初始化网络使外部可以访问*…...
c++加速方法大全
我们平常写代码的时候,经常超时,非常难受,所以,我写了这篇文章,让你的代码提升速度(这些方法作者亲测有效,用了这些方法,足足提升了1秒!虽然最后题目还是没过)…...
Llama-3.2V-11B-cot企业级应用:双卡4090支撑的生产环境视觉推理服务搭建
Llama-3.2V-11B-cot企业级应用:双卡4090支撑的生产环境视觉推理服务搭建 1. 项目概述 Llama-3.2V-11B-cot是基于Meta最新多模态大模型开发的高性能视觉推理工具,专为企业级生产环境设计。该工具针对双卡NVIDIA RTX 4090环境进行了深度优化,…...
zotero-style:提升文献管理效率的3个核心方案
zotero-style:提升文献管理效率的3个核心方案 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: https:/…...
ENVI 5.3波谱库实战:从自带库浏览到自定义库创建,遥感地物识别效率翻倍
ENVI 5.3波谱库实战:从自带库浏览到自定义库创建,遥感地物识别效率翻倍 在遥感图像解译工作中,地物波谱特征就像每类物质的"光学指纹"。ENVI 5.3的波谱库功能,正是帮助我们从海量遥感数据中快速匹配这些"指纹"…...
jcifs-ng:Java SMB客户端库如何简化企业文件共享?
jcifs-ng:Java SMB客户端库如何简化企业文件共享? 【免费下载链接】jcifs-ng A cleaned-up and improved version of the jCIFS library 项目地址: https://gitcode.com/gh_mirrors/jc/jcifs-ng jcifs-ng是一个经过清理和改进的jCIFS库版本&#…...
为什么你的Tinymce总是显示秘钥提示?深入解析富文本编辑器的授权机制
解密Tinymce授权机制:从技术原理到合规实践 每次启动项目时,那个突兀的"未授权"提示框是否让你感到困扰?作为前端开发领域的标配工具,Tinymce的授权机制远比表面看到的复杂。让我们拨开迷雾,从技术实现到商业…...
从浮点到定点:手把手教你用MATLAB自定义函数实现加减乘除(避坑溢出与精度损失)
从浮点到定点:手把手教你用MATLAB自定义函数实现加减乘除(避坑溢出与精度损失) 当算法需要从实验室环境迁移到嵌入式设备时,浮点运算的硬件开销常常成为瓶颈。这时定点数运算就像一把手术刀——精准控制每个比特的用途,…...
轻量级PDF渲染库PdfiumAndroid:Android开发者的高效集成指南
轻量级PDF渲染库PdfiumAndroid:Android开发者的高效集成指南 【免费下载链接】PdfiumAndroid 项目地址: https://gitcode.com/gh_mirrors/pd/PdfiumAndroid 核心价值:为什么选择PdfiumAndroid? 📌 解决PDF渲染痛点&#…...
Cadence原理图网表导入Allegro PCB的5个关键步骤与避坑指南(2024最新版)
Cadence原理图网表导入Allegro PCB的5个关键步骤与避坑指南(2024最新版) 在电子设计自动化(EDA)领域,Cadence和Allegro的协同工作流程是硬件工程师日常开发的核心环节。网表作为连接原理图设计与PCB布局的桥梁…...
实战应用:使用autoclaw在快马平台快速开发销售数据监控看板
最近在做一个销售数据监控看板的需求,发现用autoclaw配合InsCode(快马)平台可以快速实现从开发到部署的全流程。整个过程比想象中顺畅很多,特别适合需要快速验证业务场景的情况。这里记录下具体实现思路和关键点: 数据准备与连接 首先用autoc…...
OpenClaw更换stepfun/step-3.5-flash模型报错:Unknown model 解决(核心:漏加前缀)
OpenClaw更换stepfun/step-3.5-flash模型报错:Unknown model 解决(核心:漏加前缀) 摘要:本文聚焦OpenClaw更换stepfun/step-3.5-flash:free模型时,高频报错「Unknown model」的核心解决方法——忘记给主模…...
