Spring Boot 中操作 Bean 的生命周期
1.InitializingBean和DisposableBean
InitializingBean接口提供了afterPropertiesSet方法,用于在bean的属性设置好之后调用;
DisposableBean接口提供了destroy方法,用于在bean销毁之后调用;
public class TestComponent implements InitializingBean, DisposableBean {@Overridepublic void destroy() throws Exception {// 清理代码System.out.println("Bean is destroyed");}@Overridepublic void afterPropertiesSet() throws Exception {// 初始化代码System.out.println("Bean is initialized");}
}
2.PostConstruct和PreDestroy
PostConstruct用于依赖注入完成之后执行初始化方法;
PreDestroy用于在Bean销毁之前执行清理方法
@PostConstructpublic void init(){System.out.println("Bean is init");}@PreDestroypublic void clean(){System.out.println("PreDestroy!");}
3.Bean 定义的 initMethod 和 destroyMethod
通过@Bean注解的两个属性,指定在Bean初始化和销毁的时候执行指定的方法;

@Configuration
public class TestConfig {@Bean(initMethod = "init", destroyMethod = "cleanup")public MyBean myBean() {return new MyBean();}public static class MyBean {public void init() {System.out.println("myBean init");}public void cleanup() {System.out.println("myBean cleanup");}}
}
4.BeanPostProcessor接口
用于在bean初始化之前和初始化之后进行某种操作;主要有两个接口
postProcessBeforeInitialization:bean初始化之前执行某种操作
postProcessAfterInitialization:bean初始化之后执行某种操作
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("postProcessBeforeInitialization:"+beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("postProcessAfterInitialization:"+beanName);return bean;}
}
注意:系统中的所有bean初始化都会调这两个方法;慎重使用
5.ApplicationContextAware和BeanNameAware
ApplicationContextAware提供setApplicationContext,可以获取spring的上下文 BeanNameAware提供setBeanName,可以获取当前bean的名称;
@Component
public class MyAwareBean implements ApplicationContextAware, BeanNameAware {private String beanName;private static ApplicationContext mApplicationContext;@Overridepublic void setBeanName(String name) {this.beanName = name;// 记录 Bean 名称log.info("Bean name set to {}", name);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {mApplicationContext = applicationContext;}
}
6.FactoryBean
接口定义如下
public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();default boolean isSingleton() {return true;}
}
作用是生成其他bean,示例:
@Component
public class MyFactoryBean implements FactoryBean<MyFactoryBean.MyCustomBean> {@Overridepublic MyCustomBean getObject() throws Exception {return new MyCustomBean();}@Overridepublic Class<?> getObjectType() {return MyCustomBean.class;}public class MyCustomBean {// 自定义 Bean 的逻辑private String a1 = "test";public String getA1() {return a1;}}
}
7.EnvironmentAware, ResourceLoaderAware
EnvironmentAware提供了setEnvironment,实现了对Environment的操作;
ResourceLoaderAware提供了setResourceLoader,实现了对资源的操作;
@Component
public class MyEnvironmentAwareBean implements EnvironmentAware, ResourceLoaderAware {private Environment environment;private ResourceLoader resourceLoader;@Overridepublic void setEnvironment(Environment environment) {this.environment = environment;}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}
}
8.BeanFactoryAware
可以获取到BeanFactory,然后操作spring中的bean
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;@Component
public class MyBeanFactoryAware implements BeanFactoryAware {private BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}
}
9.profile
设置在某个环境时激活某个bean
@Configuration
public class MyConfiguration {@Bean@Profile("dev")public MyBean devMyBean() {System.out.println("MyBean dev");return new MyBean();}@Bean@Profile("prod")public MyBean prodMyBean() {System.out.println("MyBean prod");return new MyBean();}public static class MyBean {// Bean 实现}
}
10.@Lazy、@DependsOn、@Order、@Conditional
Lazy用于延迟加载,当bean被注入的时候才进行加载;
DependsOn声明bean之间的依赖顺序,一个bean的加载依赖另外一个bean,确保一个bean先初始化之后,再加载另外一个bean;通常用来管理bean之间初始化顺序和依赖管理;
order用于bean初始化的顺序;
Conditional基于特定的条件才会创建bean;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;@Configuration
public class MyConfiguration {@Bean@Conditional({MyCondition.class})public MyBean myConditionalBean() {return new MyBean();}public static class MyBean {// Bean 实现}public static class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();// 定义条件逻辑return env.containsProperty("my.custom.condition");}}
}
相关文章:
Spring Boot 中操作 Bean 的生命周期
1.InitializingBean和DisposableBean InitializingBean接口提供了afterPropertiesSet方法,用于在bean的属性设置好之后调用; DisposableBean接口提供了destroy方法,用于在bean销毁之后调用; public class TestComponent implem…...
Linux ---- Shell编程三剑客之AWK
一、awk处理文本工具 1、awk概述 awk 是一种处理文本文件的语言,是一个强大的文本分析工具。AWK是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作。用来处理列。数据可以来自标准输入也可以是管道或文件。…...
Netty入门使用
为什么会有Netty? NIO 的类库和 API 繁杂,使用起来比较麻烦,需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。开发工作量和难度都非常大,例如客户端面临断线重连、网络闪断、心跳处理、半包读写、网络拥塞和异…...
go并发编程-runtime、Channel与Goroutine
1. runtime包 1.1.1. runtime.Gosched() 让出CPU时间片,重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤,但是你妈让你去相亲,两种情况第一就是你相亲速度非常快,见面就黄不耽误你继续烧烤,第二种情况就是你相亲速度…...
HTTP概述
HTTP概述 HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议。它是在客户端和服务器之间进行通信的基础,常用于 Web 应用中。在 Java 后端开发中,HTTP 扮演着重要的角色。以下是Java 后端视角下的 HTTP 概述&a…...
ubuntu20配置mysql8
首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后,MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…...
CPU-Cache结构查看
参考【Ubuntu 查看 CPU 缓存】 本文主要介绍cpu的cache查看,以供读者能够理解该技术的定义、原理、应用。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:计算机杂记 🎀CSDN主页 发狂的小花…...
Wireshark网络协议分析 - Wireshark速览
在我的博客阅读本文 文章目录 1. 版本与平台2. 快速上手2.1. 选择网络接口进行捕获(Capture)2.2. 以Ping命令为例进行抓包分析2.3. 设置合适的过滤表达式2.4. 数据包详情2.5. TCP/IP 四层模型 3. 参考资料 1. 版本与平台 Wireshark是一个开源的网络数据…...
查看进程创建的所有线程
ps 在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为的进程创建的所有线程。 ps -T -p <pid>top op命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux…...
汽车软件开发模式的5个特点
汽车软件开发属于较为复杂的系统工程,经常让来自不同知识背景的工程师在观点交锋时出现分歧。在解决复杂性和对齐讨论基准时,可以通过勾勒出讨论对象最关键的几个特征来树立典型概念。本文旨在通过5个典型特点的抽取,来勾勒出汽车软件开发模式…...
双屏联动系统在展厅设计中的互动类型与效果
随着各项多媒体技术的快速发展,让展厅中的各类展项得到技术升级,其中作为电子设备中最基础的显示技术,不仅优化了内容的展示质量,还实现了更具互动性的创新技术,如双屏联动系统就是当前展厅设计中最常见的技术类型之一…...
STM32F407移植OpenHarmony笔记5
继上一篇笔记,搭建好STM32的编译框架,编译出来的OHOS_Image.bin并不能跑不起来。 今天要在bsp里面添加一些代码,让程序能跑起来。 先从裸机点亮LED灯开始,准备以下3个文件:startup和system文件可以用OHOS官方代码。 /device/boar…...
点击其他区域隐藏弹出框效果
一般下拉框或者选择框,持久展示时会给用户显示的隐藏方式,如点击事件后。也可以添加隐式的隐藏方式,如点击弹出框之外的区域。 CSS方法-focus伪类 当触发的元素是可以focus,以输入框为例。 可以将弹出框出现的时机设置在input:…...
Python一些可能用的到的函数系列123 ATimer2-时间偏移
说明 之前确定了时间轴(千年历),以及时间的转换方法。其中时间轴的数据将会存储在集群,以及通过RedisOrMongo保存部分常用的数据。 本次讨论时间偏移的度量问题。 内容 1 两种形式 我们提到时间时,通常会有两种方…...
企业微信主体变更 怎么操作?
企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些࿱…...
《区块链简易速速上手小册》第8章:区块链的技术挑战(2024 最新版)
文章目录 8.1 可扩展性问题8.1.1 基础知识8.1.2 主要案例:比特币的可扩展性挑战8.1.3 拓展案例 1:以太坊的可扩展性改进8.1.4 拓展案例 2:侧链和分层解决方案 8.2 安全性与隐私8.2.1 基础知识8.2.2 主要案例:比特币交易的安全性8.…...
基于STM32的云上OneNET智慧大棚(包含程序设计报告)
目录 概要 作品介绍 设计原理 设计作品结构 软件部分 概要 为了解决传统农业生产效率低下,消耗大量的人力物力,不能精确的对农作物实现监控的问题,从而最大限度的提高农业生产力,实现优质、高产、低耗、环保的可持续发展物联…...
11.scala函数进阶
目录 概述函数scala函数和方法的区别第一种第二种方法转函数 函数柯里化 结束 概述 函数 vs 方法 1.定义 方法:def函数:> 2.方法本质上是一个特殊的函数3.函数是一等公民,函数可以当做值来传递,方法的参数,返回值…...
在WebSocket中使用Redis出现空指针异常解决方案
文章目录 在WebSocket中使用Redis1.问题描述2.原因3.解决步骤1.新建一个SpringUtil.java类,通过getBean的方法主动获取实例2.在WebSocketSingleServer.java中导入 在WebSocket中使用Redis 1.问题描述 在controller 和 service中都可以正常使用Redis,在…...
问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体
问题:第十三届全国人民代表大会第四次会议召开的时间是()。 A. 2018年3月3日至3月11日 B. 2019年3月5日至3月11日 C. 2020年3月5日至3月11日 D. 2021年3月5日至3月11日 参考答案如图所示 问题:顾客满意是顾客对一件产品满足…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
