[Spring]-组件的生命周期

组件生命周期

认识组件的声明周期

实验1

通过@Bean指定组件的生命周期

package com.guigu.spring.ioc.bean;@Data
public class User {private String username;private String password;private Car car;@Autowiredpublic void setCar(Car car) {System.out.println("自动注入: 属性值" + car);this.car = car;}public User() {System.out.println("User 构造器...");}/*** 组件初始化*/public void initUser() {System.out.println("User组件初始化");}/*** 组件销毁*/public void destoryUser() {System.out.println("User组件销毁");}
}
package com.guigu.spring.ioc.config;@Configuration
public class UserConfig {@Bean(initMethod = "initUser", destroyMethod = "destoryUser")public User user() {return new User();}
}
package com.guigu.spring.ioc;/*** 主入口文件*/
@SpringBootApplication
public class Spring01IocApplication {/*** 组件的声明周期*/public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);}}

实验2

了解 InitializingBean接口 和 DisposableBean接口的 调用时机

package com.guigu.spring.ioc.bean;@Data
public class User implements InitializingBean, DisposableBean {private String username;private String password;private Car car;@Autowiredpublic void setCar(Car car) {System.out.println("setter自动注入: 属性值" + car);this.car = car;}public User() {System.out.println("User 构造器...");}/*** 组件初始化*/public void initUser() {System.out.println("User组件初始化");}/*** 组件销毁*/public void destoryUser() {System.out.println("User组件销毁");}/*** 属性设置之后调用: set赋值完成了* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("[InitializingBean]接口调用afterPropertiesSet方法");}@Overridepublic void destroy() throws Exception {System.out.println("[DisposableBean]接口调用destroy方法");}
}

实验3

了解 @PostConstruct 和 @PreDestroy 的执行时机

package com.guigu.spring.ioc.bean;@Data
public class User implements InitializingBean, DisposableBean {private String username;private String password;private Car car;/*** 构造器后置处理钩子* 构造器之后执行*/@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct....");}/*** 销毁预处理钩子*/@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy....");}
}

实验4

理解后置处理器机制: 前面的周期都是本质都是通知, 处理机制本质是拦截, 可以直接修改bean

package com.guigu.spring.ioc.processor;@Component // 拦截所有Bean的后置处理器
public class MyTestBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("[postProcessBeforeInitialization]: " + beanName);if(bean instanceof User hello) {hello.setUsername("张三测试");System.out.println("User: " + bean);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("[postProcessAfterInitialization]: " + beanName);return bean;}
}

单元测试

使用单元测试测试容器

  • @SpringBootTest注解用来开启测试,
  • 是测试那个主程序类呢? 根据包进行匹配,
  • 所以单元测试类所在的包要和主程序所在的包保持一致

注入组件并查看

package com.guigu.spring.ioc;@SpringBootTest // 测试SpringBoot功能, 测试容器
class Spring01IocApplicationTests {@AutowiredCar car;@Testvoid contextLoads() {System.out.println(car);}}

查看容器的创建

查看单元测试方法的结果

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

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

相关文章

【golang】网络数据包捕获库 gopacket

详解 github.com/google/gopacket/pcap 包 github.com/google/gopacket/pcap 是 Go 语言中一个强大的网络数据包捕获库,它是 gopacket 项目的一部分,提供了对 libpcap(Linux/Unix)和 WinPcap(Windows)的 G…

RBTree的模拟实现

1:红黑树的概念 红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因…

React 第三十九节 React Router 中的 unstable_usePrompt Hook的详细用法及案例

React Router 中的 unstable_usePrompt 是一个用于在用户尝试离开当前页面时触发确认提示的自定义钩子,常用于防止用户误操作导致数据丢失(例如未保存的表单)。 一、unstable_usePrompt用途 防止意外离开页面:当用户在当前页面有…

OSI 7层模型

OSI 7层模型: 1、物理层(光纤等把电脑连接起来的物理手段) 2、数据链路层(以太网,确认0和1电信号的分组方式,负责MAC地址,MAC地址用于在网络中唯一标示一个网卡,相当于网卡的身份证…

视频编解码学习十一之视频原始数据

一、视频未编码前的原始数据是怎样的? 视频在未编码前的原始数据被称为 原始视频数据(Raw Video Data),主要是按照帧(Frame)来组织的图像序列。每一帧本质上就是一张图片,通常采用某种颜色格式…

Redis学习打卡-Day1-SpringDataRedis、有状态无状态

Redis的Java客户端 Jedis 以 Redis 命令作为方法名称,学习成本低,简单实用。Jedis 是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用 Jedis 连接池代替Jedis的直连方式。 lettuce Lettuce是基于Netty实现的&am…

告别静态配置!Spring Boo动态线程池实战指南:Nacos+Prometheus全链路监控

一、引言 1.1 动态线程池的必要性 传统线程池的参数(如核心线程数、队列容量)通常通过配置文件静态定义,无法根据业务负载动态调整。例如,在电商大促场景中,流量可能瞬间激增,静态线程池容易因配置不合理导…

Flask如何读取配置信息

目录 一、使用 app.config 读取配置 二、设置配置的几种方式 1. 直接设置 2. 从 Python 文件加载 3. 从环境变量加载 4. 从字典加载 5. 从 .env 文件加载(推荐开发环境用) 三、读取配置值 四、最佳实践建议 在 Flask 中读取配置信息有几种常见方…

【React中useCallback钩子详解】

useCallback 是 React 中的一个性能优化 Hook,用于缓存函数引用,避免在组件重新渲染时重复创建相同的函数,从而减少不必要的子组件渲染或副作用执行。以下是其核心要点: 1. 核心作用 函数记忆化:返回一个记忆化的回调函数,仅在依赖项变化时重新创建函数,否则复用之前的函…

【!!!!终极 Java 中间件实战课:从 0 到 1 构建亿级流量电商系统全链路解决方案!!!!保姆级教程---超细】

终极 Java 中间件实战课:电商系统架构实战教程 电商系统架构实战教程1. 系统架构设计1.1 系统模块划分1.2 技术选型2. 环境搭建2.1 开发环境准备2.2 基础设施部署3. 用户服务开发3.1 创建Maven项目3.2 创建用户服务模块3.3 配置文件3.4 实体类与数据库设计3.5 DAO层实现3.6 Se…

C#异步Task,await,async和Unity同步协程

标题 TaskawaitasyncUnity协程 Task Task是声明异步任务的必要关键字&#xff0c;也可以使用Task<>泛型来定义Task的返回值。 await await是用于等待一个Task结束&#xff0c;否则让出该线程控制权&#xff0c;让步给其他线程&#xff0c;直到该Task结束才往下运行。 …

【USRP】在linux下安装python API调用

UHD 源码安装 安装库 sudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool \ g git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev \ libusb-dev python3-dev python3-mako …

什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?

我们来详细分析一下 NoSQL 数据库与关系型数据库 (RDBMS) 的主要区别。 什么是 NoSQL 数据库&#xff1f; NoSQL (通常指 “Not Only SQL” 而不仅仅是 “No SQL”) 是一类数据库管理系统的总称。它们的设计目标是解决传统关系型数据库 (RDBMS) 在某些场景下的局限性&#xf…

蓝桥杯题库经典题型

1、数列排序&#xff08;数组 排序&#xff09; 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第一行为一个整数n。 第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。 输出格式 输出…

wordpress自学笔记 第三节 独立站产品和类目的三种展示方式

wordpress自学笔记 摘自 超详细WordPress搭建独立站商城教程-第三节 独立站产品和类目的三种展示方式&#xff0c;2025 WordPress搭建独立站教程#WordPress建站教程https://www.bilibili.com/video/BV1rwcteuETZ?spm_id_from333.788.videopod.sections&vd_sourcea0af3b…

智能手表蓝牙 GATT 通讯协议文档

以下是一份适用于智能手表的 蓝牙 GATT 通讯协议文档&#xff0c;适用于 BLE 5.0 及以上标准&#xff0c;兼容 iOS / Android 平台&#xff1a; 智能手表蓝牙 GATT 通讯协议文档 文档版本&#xff1a;V1.0 编写日期&#xff1a;2025年xx月xx日 产品型号&#xff1a;Aurora Wat…

Linux PCI 驱动开发指南

注&#xff1a;本文为 “Linux PCI Drivers” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 如有内容异常&#xff0c;请看原文。 How To Write Linux PCI Drivers 翻译: 司延腾 Yanteng Si siyantengloongson.cn 1. 如何写 Linux PCI 驱动 …

Python 接入DeepSeek

不知不觉DeepSeek已经火了半年左右&#xff0c;冲浪都赶不上时代了。 今天开始学习。 本文旨在使用Python调用DeepSeek的接口&#xff08; 这里写目录标题 一、环境准备1.1 DeepSeek1.2 Python 二、接入DeepSeek2.1 参数2.2 requests2.3 openai2.4 返回示例 一、环境准备 1.1…

Java 集合与 MyBatis 动态 SQL 实战教程

一、Java 集合的创建与用法 在 Java 中&#xff0c;List、HashSet 和数组是常用的集合类型&#xff0c;以下是它们的创建与基本操作&#xff1a; 1. List 列表 创建方式&#xff1a; List<Integer> list new ArrayList<>(Arrays.asList(1, 2, 3)); // 可变列…

无人机避障——(运动规划部分)深蓝学院动力学kinodynamic A* 3D算法理论解读(附C++代码)

开源代码链接&#xff1a;GitHub - Perishell/motion-planning 效果展示&#xff1a; ROS 节点展示全局规划和轨迹生成部分&#xff1a; Kinodynamic A*代码主体&#xff1a; int KinoAstar::search(Eigen::Vector3d start_pt, Eigen::Vector3d start_vel,Eigen::Vector3d en…