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秒!虽然最后题目还是没过)…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...

HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...
十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】
一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下核心特性: 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...