Spring Bean 生命周期顺序验证

看到一篇写的很好的 Spring Bean 生命周期的博客:一文读懂 Spring Bean 的生命周期,在此写个简单的 Bean 进行验证。

1. 创建Springboot项目

基于 springboot 的2.1.8.RELEASE 创建一个简单项目,只添加 spring-aop 包以引入spring依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/></parent><groupId>com.xxx.springtest</groupId><artifactId>sprint-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- 只添加一个 aop 包以引入spring依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies></project>

2. 定义 TestBean

我们定义一个名为类型为TestBean,名为testBean的测试 bean。

package com.xxx.springtest.lifecycle;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.*;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.StringValueResolver;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** 测试验证 bean,实现了各个 *Aware 接口和 InitializingBean#afterPropertiesSet、DisposableBean#destroy 接口,* 此外,除添加了由 @PostConstruct 和 @PreDestroy 注解标注的方法外,* 还添加了自定义初始化 init()方法(该方法名在用 @Bean 声明 testBean 时设置)。*/
public class TestBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, EnvironmentAware,EmbeddedValueResolverAware, ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware,ApplicationContextAware, InitializingBean, DisposableBean {public TestBean() {System.out.println("========== TestBean 构造方法执行 ==========");}/* ==================== Aware start ==================== */@Overridepublic void setBeanName(String s) {System.out.println("4. BeanNameAware#setBeanName");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("5. BeanClassLoaderAware#setBeanClassLoader");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("6. BeanFactoryAware#setBeanFactory");}@Overridepublic void setEnvironment(Environment environment) {System.out.println("7. EnvironmentAware#setEnvironment");}@Overridepublic void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {System.out.println("8. EmbeddedValueResolverAware#setEmbeddedValueResolver");}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {System.out.println("9. ResourceLoaderAware#setResourceLoader");}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {System.out.println("10. ApplicationEventPublisherAware#setApplicationEventPublisher");}@Overridepublic void setMessageSource(MessageSource messageSource) {System.out.println("11. MessageSourceAware#setMessageSource");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("12. ApplicationContextAware#setApplicationContext");}/* ==================== Aware end ==================== */@PostConstructpublic void postConstruct() {System.out.println("14. TestInitDestroyBean#postConstruct");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("15. InitializingBean#afterPropertiesSet");}/** 自定义初始化方法 */public void customInit() {System.out.println("16. TestInitDestroyBean#customInit");}/* ==================== 停止系统程序 ==================== */@PreDestroypublic void preDestroy() {System.out.println("18. TestInitDestroyBean#preDestroy");}@Overridepublic void destroy() {System.out.println("19. TestInitDestroyBean#destroy");}/** 自定义销毁方法 */public void customDestroy() {System.out.println("20. TestInitDestroyBean#customDestroy");}
}

3. 实现 BeanFactoryPostProcessor

package com.xxx.springtest.lifecycle;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;/*** 自定义 BeanFactoryPostProcessor,该方法最先执行。*/
@Component
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.println("0. BeanFactoryPostProcessor#postProcessBeanFactory");}
}

4. InstantiationAwareBeanPostProcessor

package com.xxx.springtest.lifecycle;import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;/*** 自定义 InstantiationAwareBeanPostProcessor 处理。* 该接口的方法在实例化(调用默认构造方法)之前和之后执行。*/
@Component
public class TestInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if ("testBean".equals(beanName)) {System.out.println("1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation");}return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);}@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if ("testBean".equals(beanName)) {System.out.println("2. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation");}return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);}@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if ("testBean".equals(beanName)) {System.out.println("3. InstantiationAwareBeanPostProcessor#postProcessProperties");}return InstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);}
}

5. 实现 BeanPostProcessor

package com.xxx.springtest.lifecycle;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;/*** 自定义 BeanPostProcessor 处理。* 两个方法分别在自定义初始化方法之前和之后执行。*/
@Component
public class TestBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if ("testBean".equals(beanName)) {System.out.println("13. BeanPostProcessor#postProcessBeforeInitialization");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if ("testBean".equals(beanName)) {System.out.println("17. BeanPostProcessor#postProcessAfterInitialization");}return bean;}}

6. 配置 testBean

package com.xxx.springtest.lifecycle;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Bean 生命周期测试 Configuration*/
@Configuration
public class TestBeanLifecycleConfig {@Bean(initMethod = "customInit", destroyMethod = "customDestroy")public TestBean testBean() {return new TestBean();}
}

7. 创建启动类

package com.xxx.springtest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = {"com.xxx.springtest"})
public class SprintTestApplication {public static void main(String[] args) {SpringApplication.run(SprintTestApplication.class, args);}
}

运行并查看执行顺序

在这里插入图片描述

源码

https://gitee.com/liuweibing/spring-test-lifecycle

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

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

相关文章

Redis下载和安装(Windows系统)

文章目录 创建Redis临时服务1) 启动服务端程序2) 启动客户端程序命令创建Redis服务3) 启动Redis客户端4) 检查是否连接成功 为便于大多数读者学习本套教程&#xff0c;教程中采用 Windows 系统对 Redis 数据库进行讲解。虽然 Redis 官方网站没有提供 Windows 版的安装包&#x…

进程间通信

一、进程间通信&#xff08;interprocess communication&#xff0c;简称 IPC&#xff09;指两个进程之间的通信。 系统中每个进程都有自己的地址空间&#xff0c;并且相互独立、隔离&#xff0c;每个进程都处于自己的地址空间中。 二、通信机制 Linux 内核提供了多种 IPC 机制…

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…

WordPress(3)会员插件安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、服务器中上传插件二、使用步骤1.启动插件前言 提示:会员插件的安装不能在网站后台插件中心中直接安装原因我还没有排查 原因:会导致网站停止运行 一、服务器中上传插件 二、使用步骤 …

Python钢筋混凝土结构计算.pdf-混凝土强度设计值

计算原理&#xff1a; 需要注意的是&#xff0c;根据不同的规范和设计要求&#xff0c;上述公式可能会有所差异。因此&#xff0c;在进行混凝土强度设计值的计算时&#xff0c;请参考相应的规范和设计手册&#xff0c;以确保计算结果的准确性和合规性。 代码实现&#xff1a; …

el-select 使用

案例&#xff1a; /* * label : 界面上展示的是哪个字段,我这里需要展示名称 * value : 绑定的字段&#xff0c;一般是id */<el-selectv-model"Form.BillNumber"placeholder"请选择"change"changeValue($event)"><el-optionv-for"…

ThePASS研究院|以Safe为例,解码DAO国库管理

本研究文章由ThePASS团队呈现。ThePASS是一家开创性的DAO聚合器和搜索引擎&#xff0c;在为DAO提供洞察力和分析方面发挥着关键作用。 Intro 随着去中心化自治组织&#xff08;DAOs&#xff09;的发展&#xff0c;它们被赋予了越来越多的角色和期望。在这种巨幅增长的背景下&…

ToBeWritten之VSOC安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

论文阅读_医疗知识图谱_GraphCare

英文名称: GraphCare: Enhancing Healthcare Predictions with Open-World Personalized Knowledge Graphs 中文名称: GraphCare&#xff1a;通过开放世界的个性化知识图增强医疗保健预测 文章: http://arxiv.org/abs/2305.12788 代码: https://github.com/pat-jj/GraphCare 作…

Mac版JFormDesigner IDEA插件安装(非商业用途)

前言 仅供个人开发者使用&#xff0c;勿用作商业用途。 仅供个人开发者使用&#xff0c;勿用作商业用途。 仅供个人开发者使用&#xff0c;勿用作商业用途。 感觉做了这些年开发&#xff0c;怎么感觉市场越搞越回去了。桌面应用又成主流了&#xff1f; 甲方让做桌面客户端&am…

搭建个人备忘录中心服务memos、轻量级笔记服务

目录 一、源码 二、官网 三、搭建 四、使用 一、源码 GitHub - usememos/memos: A privacy-first, lightweight note-taking service. Easily capture and share your great thoughts. 二、官网 memos - Easily capture and share your great thoughts 三、搭建 docke…

Python Pyecharts 制图

基本图表 - pyecharts - A Python Echarts Plotting Library built with love. from pyecharts import options as opts from pyecharts.charts import Pie from pyecharts.faker import Fakerc (Pie().add("",[list(z) for z in zip(["7室1厅", "5…

MindsDB为许多不支持内置机器学习的数据库带来了机器学习功能

选择平台的首要原则是“靠近数据”,让代码靠近数据是保持低延迟的必要条件。 机器学习,特别是深度学习往往会多次遍历所有数据(遍历一次被称为一个epoch)。对于非常大的数据集来说,理想的情况是在存储数据的地方建立模型,这样就不需要大量的数据传输。目前已经有部分数据…

Java EE 突击 15 - Spring Boot 统一功能处理

Spring Boot 统一功能处理 一 . 统一功能的处理1.1 初级阶段 : 不断重复1.2 中级阶段 : 集成方法1.3 高级阶段 : Spring AOP1.4 超高级阶段 : Spring 拦截器准备工作实现拦截器自定义拦截器将自定义拦截器加入到系统配置 拦截器实现原理扩展 : 统一访问前缀添加 二 . 统一异常的…

leetcode 2483. Minimum Penalty for a Shop(商店的最少代价)

字符串customers只包含’Y’和’N’两种字母, 表示 i 时刻商店是否有客人来。 如果商店在 i 时刻处于开门状态&#xff0c;Y’的代价是0&#xff0c;N’的代价是1.&#xff08;开门了却没有客人就算损失&#xff09;。 反之&#xff0c;在 i 时刻处于关门状态&#xff0c;N’的…

AssemblyManager 程序集管理器

AssemblyManager 程序集管理器 程序执行中使用反射对框架的搭建有着强大的影响&#xff0c;如何管理程序集方便使用反射获取类型操作对象是本文章的重点 1.AssemblyInfo 对于一个程序集这里使用一个AssemblyInfo对象进行管理 Assembly &#xff1a;对应的程序集AssemblyTyp…

QT(8.30)常用类与组件,实现登录界面

1.作业&#xff1a; 完成一个登录界面(图片未附带): 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QLineEdit>//行编辑器#include<QIcon>//图标#include<QLabel>//标签#include<QPushButton>//按钮#include<QIc…

如何在Spring Boot应用中使用Nacos实现动态更新数据源

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Prometheus监控(三)架构

文章目录 Prometheus架构图Prometheus生态圈组件Prometheus Serverclient librariesPushgatewayexporterAlartmanager Prometheus架构理解存储计算层采集层应用层 Prometheus架构图 Prometheus生态圈组件 Prometheus Server 主服务器&#xff0c;负责收集和存储时间序列数据 …

发布自己的npm包

1.初始化npm包 npm init 输入npm init后&#xff0c;一路默认即可初始化成功&#xff0c;如下&#xff1a; 初始化成功后会生成一个package.json文件 n&#xff08;以我的文件夹demo-npm-dir为例&#xff09; package.json配置如下&#xff1a; {"name": "n…