Spring中Bean的生命周期管理

Spring框架中的Bean生命周期是指从创建到销毁的整个过程。在这个过程中,Spring容器会负责管理Bean的状态和行为。以下是Spring中Bean生命周期的详细解释:

  1. 实例化:Spring容器根据Bean的定义信息,通过反射机制创建Bean对象。

  2. 设置属性值:Spring容器会根据Bean定义中的配置信息,为Bean对象设置属性值。这包括依赖注入的过程。

  3. 调用BeanNameAware接口方法:如果Bean实现了BeanNameAware接口,Spring容器会调用setBeanName()方法,将Bean的名称传递给Bean。

  4. 调用BeanFactoryAware接口方法:如果Bean实现了BeanFactoryAware接口,Spring容器会调用setBeanFactory()方法,将BeanFactory实例传递给Bean。

  5. 调用ApplicationContextAware接口方法:如果Bean实现了ApplicationContextAware接口,Spring容器会调用setApplicationContext()方法,将ApplicationContext实例传递给Bean。

  6. 调用BeanPostProcessor的postProcessBeforeInitialization()方法:Spring容器会调用实现了BeanPostProcessor接口的类的postProcessBeforeInitialization()方法,对Bean进行预初始化处理。

  7. 调用InitializingBean接口方法:如果Bean实现了InitializingBean接口,Spring容器会调用afterPropertiesSet()方法,用于Bean的初始化操作。

  8. 调用自定义的初始化方法:如果在Bean定义中配置了init-method属性,Spring容器会调用指定的初始化方法。

  9. 调用BeanPostProcessor的postProcessAfterInitialization()方法:Spring容器会调用实现了BeanPostProcessor接口的类的postProcessAfterInitialization()方法,对Bean进行初始化后的处理。

  10. Bean可以被使用:此时Bean已经初始化完成,可以被应用程序正常使用。

  11. 调用DisposableBean接口方法:当容器关闭时,如果Bean实现了DisposableBean接口,Spring容器会调用destroy()方法,用于Bean的资源释放操作。

  12. 调用自定义的销毁方法:如果在Bean定义中配置了destroy-method属性,Spring容器会调用指定的销毁方法。

  13. 销毁Bean:Spring容器销毁Bean对象,释放内存资源。

总结一下,Spring中Bean的生命周期包括实例化、设置属性值、调用Aware接口方法、调用BeanPostProcessor的前后处理方法、调用InitializingBean和DisposableBean接口方法以及自定义的初始化和销毁方法。在这个过程中,Spring容器负责管理Bean的状态和行为。

以下为示例代码

MyBean

package org.example.bean01.ch01;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class MyBean implements ApplicationContextAware, BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {private String name;private String address;private int phone;private String beanName;private BeanFactory beanFactory;private ApplicationContext context;// 通过<bean>的init-method属性指定的初始化方法public void myInit() {System.out.println("调用<bean>的init-method属性指定的初始化方法");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.context = applicationContext;System.out.println("调用ApplicationContextAware.setApplicationContext接口");}public String show() {return this.toString();}public MyBean() {System.out.println("调用MyBean的构造器实例化");}public String getName() {return name;}public void setName(String name) {System.out.println("注入属性name");this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {System.out.println("注入属性address");this.address = address;}public int getPhone() {return phone;}public void setPhone(int phone) {System.out.println("注入属性phone");this.phone = phone;}@Overridepublic String toString() {return "MyBean [address=" + address + ", name=" + name + ", phone=" + phone + "]";}// 这是BeanFactoryAware接口方法@Overridepublic void setBeanFactory(BeanFactory arg0) throws BeansException {System.out.println("调用BeanFactoryAware.setBeanFactory()");this.beanFactory = arg0;}// 这是BeanNameAware接口方法@Overridepublic void setBeanName(String arg0) {System.out.println("调用BeanNameAware.setBeanName()");this.beanName = arg0;}// 这是InitializingBean接口方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("调用InitializingBean.afterPropertiesSet()");}// 这是DiposibleBean接口方法@Overridepublic void destroy() throws Exception {System.out.println("调用DiposibleBean.destory()");}// 通过<bean>的destroy-method属性指定的初始化方法public void myDestory() {System.out.println("调用<bean>的destroy-method属性指定的初始化方法");}
}

MyBeanFactoryPostProcessor

package org.example.bean01.ch01;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class MyBean implements ApplicationContextAware, BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {private String name;private String address;private int phone;private String beanName;private BeanFactory beanFactory;private ApplicationContext context;// 通过<bean>的init-method属性指定的初始化方法public void myInit() {System.out.println("调用<bean>的init-method属性指定的初始化方法");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.context = applicationContext;System.out.println("调用ApplicationContextAware.setApplicationContext接口");}public String show() {return this.toString();}public MyBean() {System.out.println("调用MyBean的构造器实例化");}public String getName() {return name;}public void setName(String name) {System.out.println("注入属性name");this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {System.out.println("注入属性address");this.address = address;}public int getPhone() {return phone;}public void setPhone(int phone) {System.out.println("注入属性phone");this.phone = phone;}@Overridepublic String toString() {return "MyBean [address=" + address + ", name=" + name + ", phone=" + phone + "]";}// 这是BeanFactoryAware接口方法@Overridepublic void setBeanFactory(BeanFactory arg0) throws BeansException {System.out.println("调用BeanFactoryAware.setBeanFactory()");this.beanFactory = arg0;}// 这是BeanNameAware接口方法@Overridepublic void setBeanName(String arg0) {System.out.println("调用BeanNameAware.setBeanName()");this.beanName = arg0;}// 这是InitializingBean接口方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("调用InitializingBean.afterPropertiesSet()");}// 这是DiposibleBean接口方法@Overridepublic void destroy() throws Exception {System.out.println("调用DiposibleBean.destory()");}// 通过<bean>的destroy-method属性指定的初始化方法public void myDestory() {System.out.println("调用<bean>的destroy-method属性指定的初始化方法");}
}

MyBeanPostProcessor

package org.example.bean01.ch01;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {public MyBeanPostProcessor() {super();System.out.println("调用BeanPostProcessor实现类构造器");}@Overridepublic Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!");return arg0;}@Overridepublic Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!");return arg0;}
}

AppConfig

package org.example.bean01.ch01;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = "org.example.bean01.ch01")
public class AppConfig {@Beanpublic MyBeanPostProcessor myBeanPostProcessor() {return new MyBeanPostProcessor();}@Beanpublic MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {return new MyBeanFactoryPostProcessor();}@Bean(initMethod = "myInit", destroyMethod = "myDestory")public MyBean myBean() {return new MyBean();}}

启动类BeanDemo

package org.example.bean01.ch01;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class BeanDemo {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MyBean myBean = context.getBean(MyBean.class);// 使用BeanSystem.out.println("Using bean: " + myBean.show());context.close();}
}

执行结果

在这里插入图片描述

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

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

相关文章

“阉割版”ADS还能遥遥领先吗?

文/王俣祺 导语&#xff1a;随着特斯拉FSD一次又一次的“入华无门”&#xff0c; 让国内车企智能驾驶的“内卷”之争迎来了喘息的余地&#xff0c;而“端到端”也成为现如今市场上的首要研发目标。早在今年4月份&#xff0c;华为就宣布其研发的HUAWEI ADS 3.0已经采用了最新的端…

Java-数据结构-包装类和认识泛型 !!!∑(゚Д゚ノ)ノ

目录&#xff1a; 一、包装类&#xff1a; 1、基本数据类型所对应的包装类&#xff1a; 2、装箱和拆箱&#xff1a; 二、 泛型&#xff1a; 1、什么是泛型&#xff1a; 2、语法&#xff1a; 三、泛型类的使用&#xff1a; 四、裸类型&#xff1a; 五、泛型的擦除机制&…

[oeasy]python031_[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics

[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics &#x1f94b; 回忆上次内容 上次 动态设置了 断点 断点 可以把代码 切成一段一段的可以 更快地调试 调试的目的 是 去除 bug 别害怕 bug 一步步 总能找到 bug这 就是 程序员基本功 调试 debug 在bug出现的时候 甚至…

Python 变量类型

Python 变量类型 变量赋值 多个变量赋值 标准数据类型 Python 数字 Python字符串 Python列表 Python 元组 Python 字典 Python数据类型转换 Python 变量类型 变量是存储在内存中的值&#xff0c;这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型…

【视频讲解】主成分分析原理与水果成熟数据实例:Python中PCA-LDA 与卷积神经网络CNN...

全文链接&#xff1a;https://tecdat.cn/?p37450 分析师&#xff1a;Shixian Ding 主成分分析&#xff08;PCA&#xff09;作为数据科学中用于可视化和降维的重要工具&#xff0c;在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本 1000 页的书&#xff0…

实现流程化办公,可专注于开源可视化报表设计器!

近日&#xff0c;有很多粉丝和朋友们会问我们关于低代码技术平台、开源可视化报表设计器的相关内容和问题。其实&#xff0c;在流程化办公新时代&#xff0c;愿意启用新软件平台的客户朋友会收获市场红利&#xff0c;也会站在前沿之地上斩获更多市场份额。今天我们就一起来了解…

随机森林与线性回归

集成学习方法之随机森林 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个分类器来提高预测性能的方法。主要分为三种类型:Bagging、Boosting和Stacking。以下是集成学习的基本步骤和概念&#xff1a; 1数据采样&#xff1a;从训练集中有放回地随机抽取…

【渗透测试】ATTCK靶场一,phpmyadmin,域渗透,内网横向移动攻略

前言 博客主页&#xff1a;h0ack1r丶羽~ 从0到1~ VulnStack&#xff0c;作为红日安全团队匠心打造的知识平台&#xff0c;其独特优势在于全面模拟了国内企业的实际业务场景&#xff0c;涵盖了CMS、漏洞管理及域管理等核心要素。这一设计理念源于红日安全团队对ATT&CK红队评…

斯坦福大学cs231n (图像分类)

1.介绍 当作图像分类时&#xff0c;分类系统接收一些分类图像&#xff0c;比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么&#xff0c;计算机的工作就是根据图片&#xff0c;给他分配一些固定的分类或者标签。 对于一个计算机来说&#xff0c;这是一个非常…

springsecurity 在web中如何获取用户信息(后端/前端)

一、SecurityContextHolder 是什么 SecurityContextHolder用来获取登录之后用户信息。Spring Security 会将登录用户数据保存在Session中。但是&#xff0c;为了使用方便,Spring Security在此基础上还做了一些改进&#xff0c;其中最主要的一个变化就是线程绑定。当用户登录成功…

FastGPT如何增减用户

背景 开源版本的FastGPT默认只有一个超级用户root&#xff0c;为了更好地管理应用和知识库&#xff0c;可以通过操作MongoDB数据库来增加新的用户和团队。 所需环境 已安装并运行的FastGPT实例MongoDB客户端工具&#xff08;如Mongo Shell或Robo 3T等&#xff09; 操作步骤…

数据库三大范式

三大范式 一种数据库设计理念&#xff0c;意义在于降低耦合 写代码 高内聚 低耦合 一个表只有一个主键 一个主键可以是多列 ‌第一范式&#xff08;1NF&#xff09;‌&#xff1a;要求数据库表的每一列都是不可分割的原子数据项&#xff0c;即列中存储的数据是最小的数据单元&…

并发服务器

一、服务器 1.单循环服务器&#xff1a;同一时刻&#xff0c;只能处理一个客户端的任务&#xff1b; 2.并发服务器&#xff1a;同一时刻&#xff0c;可以处理多个客户端的任务&#xff1b; 3.TCP并发服务器&#xff1a; &#xff08;1&#xff09;多进程: &#xff08;2&a…

搭建面向切面编程项目

此项目在整合Mybatis基础上修改&#xff0c;可参考主页的整合Mybatis文章 注解版本 第一步 引入maven坐标 <!-- 切面编程所需jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>…

Windows 11系统 Eclipse 2024版本安装教程和环境搭建

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Eclipse 是一个开源的集成开发环境 (IDE)&#xff0c;主要用于 Java 开发&#xff0c;但也支持其他编程语言如 C、Python 和 PHP。它提供了丰富的工具和插件&#xff0c;用于编写、调试和管理代码&#x…

安卓13 背光反向 亮度反向 android13 backlight reverse

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 有些设备,在调整背光的时候,会发现,背光调大,显示亮度反而变暗,背光调小,亮度变亮。这是由于PWM背光本身并没有一个标准去决定怎么样算是高亮度,怎么算是低亮度。因…

《黑神话·悟空》是用什么编程语言开发的?

最近火爆全球的国产 3A 大作《黑神话悟空》&#xff0c;你玩了吗&#xff1f;没玩没关系&#xff0c;有人就是对游戏不感冒&#xff0c;我找了个宣发片&#xff0c;一起感受下3A大作的视觉冲击&#xff0c;而且还是我们从小听到大&#xff0c;那猴子&#x1f412;的故事。 ‌‌…

Onnx使用预训练的 ResNet18 模型对输入图像进行分类,并将分类结果显示在图像上

目录 一、整体功能概述 二、函数分析 2.1 resnet() 函数&#xff1a; 2.2 pre_process(img_path) 函数&#xff1a; 2.3 loadOnnx(img_path) 函数&#xff1a; 三、代码执行流程 一、整体功能概述 这段代码实现了一个图像分类系统&#xff0c;使用预训练的 ResNet18 模型对…

设计模式26-解析器模式

设计模式26-解析器模式 动机定义与结构定义结构 C代码推导代码说明 优缺点应用总结 动机 在软件构建过程中&#xff0c;如果某一特定领域的问题比较复杂&#xff0c;类似结构会不断重复的出现。如果使用普通的编程方式来实现&#xff0c;将面临非常频繁的变化。 在这种情况下&…

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能

无人机 PX4 飞控 | ROS应用层开发&#xff1a;指令&#xff08;字符串&#xff09;订阅功能 指令&#xff08;字符串&#xff09;订阅功能代码测试 指令&#xff08;字符串&#xff09;订阅功能 为了通过键盘触发mavros 的不同功能&#xff0c;需要实现一个订阅字符串的功能 该…