Bean 的生命周期的各个阶段

Bean的生命周期通常可以归结为以下几个阶段:

1.实例化(Instantiation):

Spring根据Bean的定义(如XML配置、Java配置或注解)来实例化Bean,这个阶段会分配内存空间给Bean,生成一个原始的、未配置的对象

2.属性赋值(Populate Properties):Spring设置Bean的属性,如依赖注入

3.初始化(Initialization):

a. 执⾏各种通知,如 BeanNameAware ,BeanFactoryAware ,ApplicationContextAware 的接⼝⽅法.
b. 执⾏初始化⽅法
        ▪ xml定义 init-method 
        ▪ 使⽤注解的⽅式 @PostConstruct 
        ▪ 执⾏初始化后置⽅法( BeanPostProcessor )

如果在<bean>定义中指定了init-method属性,则会调用指定的初始化方法。

如果Bean实现了BeanPostProcessor接口,Spring调用postProcessAfterInitialization()方法。

4.使用(In use by application):Bean现在可以被应用程序使用了。

5.销毁(Destruction):

当Bean对象不再被使用时,应该将其销毁并释放占用的内存空间。在Spring框架中,Bean的销毁可以通过配置文件中的destroy-method属性进行指定。

如果在<bean>定义中指定了destroy-method属性,则会调用指定的销毁方法。

尝试通过日常生活中的事物来类比这个过程。使用人的一生来类比Bean的生命周期

生命开始(出生)(实例化 )

起名字(属性设置)

上户口( 初始化)

长大(使用Bean)

生命结束(Bean销毁)

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@SpringBootApplication
public class SpringBeanApplication implements CommandLineRunner {@Autowiredprivate BeanLifeComponent beanLifeComponent;public static void main(String[] args) {ConfigurableApplicationContext context =SpringApplication.run(SpringBeanApplication.class, args);context.getBean(BeanLifeComponent.class);context.close();}@Configurationstatic class BeanConfig{@Beanpublic BeanLifeComponent beanLifeComponent(){BeanLifeComponent beanLifeComponent = new BeanLifeComponent();beanLifeComponent.setName("hello spring");return beanLifeComponent;}}@Overridepublic void run(String... args) throws Exception {beanLifeComponent.use();}}
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;@Component
public class BeanLifeComponent implements BeanNameAware {private String name;public BeanLifeComponent() {System.out.println("执行构造方法");}public void setName(String name) {this.name = name;System.out.println("设置name属性" + name);}@Overridepublic void setBeanName(String s) {System.out.println("执行了setBeanName方法" +s);}@PostConstructpublic void postConstruct(){System.out.println("执行了postConstruct方法");}public void use() {System.out.println("使用 Bean name属性: " +name );}@PreDestroypublic void preDestroy() {System.out.println("销毁方法执行");}}
 

在Spring框架中,@PostConstruct@PreDestroy是两个重要的注解,它们分别用于标记在依赖注入完成后需要执行的方法和在Spring容器销毁bean之前需要执行的方法。

@PostConstruct

@PostConstruct注解用于在依赖注入完成后,初始化方法执行之前调用。这意味着,当你有一个bean,并且Spring容器完成了对这个bean的依赖注入后,紧接着就会调用被@PostConstruct注解的方法。

这个注解主要用于执行一些初始化逻辑,比如设置初始值、启动服务、加载数据等。由于它是在依赖注入之后调用的,所以你可以安全地访问任何通过依赖注入获得的资源。

@PreDestroy

@PreDestroy注解用于在Spring容器销毁bean之前调用。当Spring容器关闭时(例如,应用服务器停止时),它会先调用所有bean的@PreDestroy方法,然后再销毁这些bean。

这个注解主要用于执行一些清理逻辑,比如关闭文件句柄、释放数据库连接、停止服务等。由于它是在bean销毁之前调用的,所以你可以安全地执行一些清理操作,确保在bean被销毁之前资源得到正确释放。

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

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

相关文章

微服务:Ribbon负载均衡与加载时机修改

Ribbon 负载均衡 执行流程 负载均衡策略 调整负载均衡方案&#xff1a; 配置类中&#xff08;全局&#xff09;&#xff1a; // 负载均衡策略Beanpublic IRule randomRule() {return new RandomRule();}yaml配置 userservice: # 给某个微服务配置负载均衡规则&#xff…

Mac 安装 git

文章目录 前言一、介绍二、下载三、验证四、配置五、Git常用命令六、git提交和撤销工作流程代码提交和提交同步代码撤销和撤销同步 FAQ1.homebrew 下载解决方法一&#xff08;强烈推荐&#xff09;&#xff1a;解决方法二&#xff1a; 总结 前言 Git 是一个开源的分布式版本控…

Fastadmin框架使用phpstudy部署,部分页面404无法显示

背景 在windows系统下&#xff0c;使用phpstudy部署fastadmin框架&#xff0c;会部分页面404无法访问。 解决方案 原来是要用伪静态&#xff0c;自己看官方视频时喜欢跳着看&#xff0c;刚好漏了&#xff0c;这里记录下。 依次点击如下&#xff1a; 如果你是Apache&#xf…

使用libtorch加载YOLOv8生成的torchscript文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

【C语言】自定义类型:联合与枚举的简明概述

&#x1f525;引言 关于自定义类型除了我们常用的结构体&#xff0c;还有联合与枚举也是属于自定义类型。本篇将简单介绍联合与枚举基本概念和使用方法 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&…

etcd 和 MongoDB 的混沌(故障注入)测试方法

最近在对一些自建的数据库 driver/client 基础库的健壮性做混沌&#xff08;故障&#xff09;测试, 去验证了解业务的故障处理机制和恢复时长. 主要涉及到了 MongoDB 和 etcd 这两个基础组件. 本文会介绍下相关的测试方法. MongoDB 中的故障测试 MongoDB 是比较世界上热门的文…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞&#xff0c;我刷题还是太少了&#xff0c;所以很多例子来自ctfshow&#xff0c;以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中&#xff0c;有两中判断相等的符号&#xff0c;和&…

c# 贪心算法(Greedy Algo)

贪婪是一种算法范式&#xff0c;它逐步构建解决方案&#xff0c;始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性&#xff0c;则可以使用贪心法解决优化问题&#xff1a; 每一步&#xff0c;我们都可以做出当前看来最好的选择&…

HTML-JavaWeb

目录 1.标题排版 2.标题样式 ​编辑 ​编辑 小结 3.超链接 4.正文排版 ​编辑​编辑​编辑5.正文布局 6.表格标签 7.表单标签 8.表单项标签 1.标题排版 ● 图片标签 :< img> src:指定图像的ur1(绝对路径/相对路径) width:图像的宽度(像素/相对于父元素的百…

月薪5万是怎样谈的?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;目前是晶圆厂的PE&#xff0c;但是想跳槽谈了几次薪水&#xff0c;都没法有大幅度的增长&#xff0c;该怎么办&#xff1f;“学得文武…

感知觉训练:解锁独立生活的钥匙

在日新月异的科技时代&#xff0c;一款名为“蝙蝠避障”的辅助软件以其独到之处&#xff0c;为盲人朋友的日常生活平添了诸多便利&#xff0c;不仅实现了实时避障&#xff0c;还通过拍照识别功能扩展了信息获取的边界。然而&#xff0c;科技辅助之外&#xff0c;提升盲人朋友的…

低代码的原理、发展历史、使用场景和优势。

在数字化转型的浪潮中&#xff0c;低代码开发平台&#xff08;YDUIbuilder&#xff09;以其独特的优势迅速崛起&#xff0c;为各行各业带来了创新的解决方案。本文将深入探讨低代码的原理、发展历史、使用场景以及它所带来的优势。 gitee下载&#xff1a;yduibuilder: 快速开发…

MySQL从入门到高级 --- 10.索引

文章目录 第十章&#xff1a;10.索引10.1 分类10.2 创建索引10.2.1 单列索引 - 普通索引10.2.2 查看索引10.2.3 删除索引10.2.4 单列索引 - 唯一索引10.2.5 单列索引 - 主键索引10.2.6 组合索引 10.3 全文索引10.3.1 概述10.3.2 使用 10.4 空间索引10.4.1 操作 10.5 原理10.5.1…

PyTorch学习笔记:新冠肺炎X光分类

前言 目的是要了解pytorch如何完成模型训练 https://github.com/TingsongYu/PyTorch-Tutorial-2nd参考的学习笔记 数据准备 由于本案例目的是pytorch流程学习&#xff0c;为了简化学习过程&#xff0c;数据仅选择了4张图片&#xff0c;分为2类&#xff0c;正常与新冠&#xf…

Python爬虫实战:利用代理IP获取电商数据

文章目录 1.电商数据介绍2.爬取目标3.代理IP推荐4.准备工作4.1 模块安装4.2 代理IP获取 5.爬虫代码实战5.1分析网页5.1.1 获取cookie5.1.2 关键词分析5.1.3 翻页分析5.1.4 数据获取分析 5.2 发送请求5.3 提取数据5.4 保存数据5.5 完整源码5.6 数据分析六、总结 1.电商数据介绍 …

回收站清空的文件怎么恢复?8个方法公开(2024更新版)

“我太粗心了&#xff0c;刚想恢复部分回收站中误删的重要文件&#xff0c;一不小心把回收站清空了&#xff0c;现在还有什么方法可以恢复它们吗&#xff1f;” 在数字时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;随着我们对电脑的依赖加…

linux经典定时任务

在使用时记得替换为自己的脚本路径。请在相应的脚本第一行加上#!/bin/bash&#xff0c;否则脚本在定时任务中无法执行。 1、在每天凌晨2点执行 0 2 * * * /bin/sh bashup.sh 2、每天执行两次 下面的示例命令将在每天上午5点和下午5点执行。您可以通过逗号分隔指定多个时间戳…

LeetCode:279.完全平方数

class Solution:def numSquares(self, n: int) -> int:dp[i for i in range(n1)]for i in range(2,n1):for j in range(1,int(i**(0.5))1):dp[i]min(dp[i],dp[i-j*j]1)return dp[-1]代码解释 初始化 DP 数组&#xff1a; dp [i for i in range(n1)] 这里&#xff0c;dp[i]…

【云原生】Kubernetes-----POD资源限制与探针机制

目录 引言 一、资源限制 &#xff08;一&#xff09;基本定义 &#xff08;二&#xff09;资源单位 1.CPU资源 2.内存资源 &#xff08;三&#xff09;请求与限制 &#xff08;四&#xff09;定义方式 1.编写yaml文件 2.查看资源情况 &#xff08;五&#xff09;资源…

构建智能化商场存包柜平台的数据结构设计

随着城市生活节奏的加快&#xff0c;人们对于便利的需求也越来越迫切。在城市中&#xff0c;商场存包柜平台成为了解决人们日常出行中行李存放问题的重要设施。为了更好地管理和运营这些存包柜&#xff0c;智能化商场存包柜平台的数据结构设计显得尤为关键。 一、需求分析与功能…