Springboot - 5.Bean的生命周期

✍1. Bean的生命周期:

当然,我会详细描述每一步的作用。

🎷1. 实例化Bean:

  • 这是Bean生命周期的第一步。Spring容器通过反射机制创建Bean的实例。
    public class ExampleBean {// ...
    }
    

🎷2. 设置Bean的属性:

  • Spring容器将根据配置文件设置Bean的属性。这是通过调用Bean的setter方法完成的。
    public class ExampleBean {private String name;public void setName(String name) {this.name = name;}// ...
    }
    

🎷3. 调用BeanNameAwaresetBeanName方法:

  • 如果Bean实现了BeanNameAware接口,Spring容器将调用setBeanName方法,传递Bean的ID。这允许Bean知道它在Spring容器中的ID。
    public class ExampleBean implements BeanNameAware {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name;}// ...
    }
    

🎷4. 调用BeanFactoryAwaresetBeanFactory方法:

  • 如果Bean实现了BeanFactoryAware接口,Spring容器将调用setBeanFactory方法,传递自身。这允许Bean知道它所属的容器。
    public class ExampleBean implements BeanFactoryAware {private BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}// ...
    }
    

🎷5. 调用ApplicationContextAwaresetApplicationContext方法:

  • 如果Bean实现了ApplicationContextAware接口,Spring容器将调用setApplicationContext方法,传递自身。这允许Bean知道它所属的应用上下文。
    public class ExampleBean implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}// ...
    }
    

🎷6. 调用BeanPostProcessorpostProcessBeforeInitialization方法:

  • 如果Bean实现了BeanPostProcessor接口,Spring容器将在初始化方法之前调用postProcessBeforeInitialization方法。这允许对Bean的属性进行更改。
    public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// ...return bean;}// ...
    }
    

🎷7. 调用InitializingBeanafterPropertiesSet方法:

  • 如果Bean实现了InitializingBean接口,Spring容器将在所有属性设置完成后调用afterPropertiesSet方法。
    public class ExampleBean implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// ...}// ...
    }
    

🎷8. 调用自定义的初始化方法:

  • 如果在Bean的定义中指定了自定义的初始化方法,Spring容器将调用它。
    public class ExampleBean {public void init() {// ...}// ...
    }
    

🎷9. 调用BeanPostProcessorpostProcessAfterInitialization方法:

  • 如果Bean实plement了BeanPostProcessor接口,Spring容器将在初始化方法之后调用postProcessAfterInitialization方法。
    public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// ...return bean;}// ...
    }
    

🎷10. Bean的使用:

  • 现在,Bean已经准备好了,可以被应用程序使用。

🎷11. 调用DisposableBeandestroy方法:

  • 如果Bean实现了DisposableBean接口,Spring容器将在容器关闭时调用destroy方法。
    public class ExampleBean implements DisposableBean {@Overridepublic void destroy() throws Exception {// ...}// ...
    }
    

🎷12. 调用自定义的销毁方法:

  • 如果在Bean的定义中指定了自定义的销毁方法,Spring容器将在容器关闭时调用它。
    public class ExampleBean {public void destroy() {// ...}// ...
    }
    

🎷13. 下面是一个简单的Java配置示例:

@Configuration
public class AppConfig {@Bean(initMethod = "init", destroyMethod = "destroy")public ExampleBean exampleBean() {return new ExampleBean();}}
  • 在这个示例中,ExampleBean是一个简单的Java类,它有initdestroy方法,分别作为初始化和销毁方法。

🎷14. 流程图如下:

+-------------------+
|   实例化Bean       |
+-------------------+|v
+-------------------+
|  设置Bean的属性     |
+-------------------+|v
+-------------------+
| 调用BeanNameAware  |
| 的setBeanName方法   |
+-------------------+|v
+-------------------+
| 调用BeanFactoryAware|
| 的setBeanFactory方法 |
+-------------------+|v
+-------------------+
| 调用ApplicationContextAware|
| 的setApplicationContext方法 |
+-------------------+|v
+-------------------+
| 调用BeanPostProcessor |
| 的postProcessBeforeInitialization方法 |
+-------------------+|v
+-------------------+
| 调用InitializingBean|
| 的afterPropertiesSet方法 |
+-------------------+|v
+-------------------+
| 调用自定义的初始化方法 |
+-------------------+|v
+-------------------+
| 调用BeanPostProcessor |
| 的postProcessAfterInitialization方法 |
+-------------------+|v
+-------------------+
|     Bean的使用      |
+-------------------+|v
+-------------------+
| 调用DisposableBean |
| 的destroy方法       |
+-------------------+|v
+-------------------+
| 调用自定义的销毁方法  |
+-------------------+

✍2. 如何使用Bean的生命周期:

在Spring Boot中,我们可以使用Java配置、注解和自定义的BeanPostProcessor来使用Bean的生命周期。

🎷1. 使用Java配置:

  • 我们可以使用@Bean注解的initMethoddestroyMethod属性来指定Bean的初始化和销毁方法。

    @Configuration
    public class AppConfig {@Bean(initMethod = "init", destroyMethod = "destroy")public ExampleBean exampleBean() {return new ExampleBean();}}public class ExampleBean {public void init() {System.out.println("ExampleBean 初始化");}public void destroy() {System.out.println("ExampleBean 销毁");}}
    

    在这个示例中,ExampleBean是一个简单的Java类,它有initdestroy方法,分别作为初始化和销毁方法。

🎷2. 使用@PostConstruct@PreDestroy注解:

  • 我们可以使用@PostConstruct注解来标记Bean的初始化方法,使用@PreDestroy注解来标记Bean的销毁方法。

    @Component
    public class ExampleBean {@PostConstructpublic void init() {System.out.println("ExampleBean 初始化");}@PreDestroypublic void destroy() {System.out.println("ExampleBean 销毁");}}
    

    在这个示例中,ExampleBean是一个简单的Java类,它有initdestroy方法,分别作为初始化和销毁方法。

🎷3. 使用InitializingBeanDisposableBean接口:

  • 我们可以让Bean实现InitializingBean接口和DisposableBean接口。

    @Component
    public class ExampleBean implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("ExampleBean 初始化");}@Overridepublic void destroy() throws Exception {System.out.println("ExampleBean 销毁");}}
    

    在这个示例中,ExampleBean是一个简单的Java类,它实现了InitializingBean接口和DisposableBean接口。

🎷4. 使用自定义的BeanPostProcessor:

  • 我们可以创建一个自定义的BeanPostProcessor,并在postProcessBeforeInitialization方法和postProcessAfterInitialization方法中添加自定义的逻辑。

    @Component
    public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ExampleBean) {System.out.println("ExampleBean 初始化之前");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ExampleBean) {System.out.println("ExampleBean 初始化之后");}return bean;}}@Component
    public class ExampleBean {// ...}
    

    在这个示例中,CustomBeanPostProcessor是一个自定义的BeanPostProcessor,它在ExampleBean的初始化之前和之后添加了自定义的逻辑。

✍3. 优缺点和使用场景

当描述每个Bean的生命周期阶段时,我已经包括了各个阶段的作用、使用场景以及优缺点。每个阶段都对应着特定的操作和目的,以下是对每个阶段的描述和附加信息:

🎷 1. 实例化Bean:

  • 作用:创建Bean的实例,使用反射机制根据配置信息生成一个新的对象。
  • 使用场景:在这个阶段,主要是实例化对象,通常不涉及太多业务逻辑。
  • 优缺点:这个阶段没有特定的优缺点,它是整个生命周期的起点,为后续的操作提供了基础。

🎷 2. 设置Bean的属性:

  • 作用:根据配置文件设置Bean的属性,通过调用setter方法完成。
  • 使用场景:在这个阶段,属性被设置为配置文件中指定的值,准备好被后续的初始化方法使用。
  • 优缺点:这个阶段是为了确保Bean的属性已正确设置,没有明显的优缺点。

🎷 3. 调用BeanNameAwaresetBeanName方法:

  • 作用:如果Bean实现了BeanNameAware接口,容器将传递Bean的ID,让Bean知道自己在容器中的名称。
  • 使用场景:当Bean需要知道自己在容器中的名称时,可以实现此接口。
  • 优缺点:这个阶段可以让Bean获取自己的ID,有助于Bean在后续的操作中使用这个信息。

🎷 4. 调用BeanFactoryAwaresetBeanFactory方法:

  • 作用:如果Bean实现了BeanFactoryAware接口,容器将传递自身,让Bean知道所属的容器。
  • 使用场景:当Bean需要与容器进行交互,例如获取其他Bean,可以实现此接口。
  • 优缺点:这个阶段允许Bean与容器进行交互,获取其他Bean的引用,但在较新的Spring版本中,通常使用更现代的依赖注入方式。

🎷 5. 调用ApplicationContextAwaresetApplicationContext方法:

  • 作用:如果Bean实现了ApplicationContextAware接口,容器将传递应用上下文,让Bean知道所属的应用上下文。
  • 使用场景:当Bean需要与应用上下文进行交互,例如获取消息资源、执行AOP等,可以实现此接口。
  • 优缺点:这个阶段允许Bean与应用上下文进行交互,获取应用上下文中的各种资源和服务。

🎷 6. 调用BeanPostProcessorpostProcessBeforeInitialization方法:

  • 作用:如果Bean实现了BeanPostProcessor接口,容器将在初始化方法之前调用此方法,允许对Bean的属性进行更改。
  • 使用场景:当需要在Bean初始化之前对属性进行修改或处理时,可以实现此接口。
  • 优缺点:这个阶段允许对Bean进行额外的定制和处理,但需要小心不要影响初始化流程。

🎷 7. 调用InitializingBeanafterPropertiesSet方法:

  • 作用:如果Bean实现了InitializingBean接口,容器将在所有属性设置完成后调用此方法,用于执行额外的初始化逻辑。
  • 使用场景:当需要在属性设置完成后执行初始化逻辑时,可以实现此接口。
  • 优缺点:这个阶段允许在属性设置完成后执行自定义的初始化操作,但是与Spring API的耦合度较高。

🎷 8. 调用自定义的初始化方法:

  • 作用:调用Bean定义中指定的自定义初始化方法,执行特定的初始化逻辑。
  • 使用场景:当需要在Bean初始化阶段执行特定的业务逻辑时,可以通过配置自定义的初始化方法。
  • 优缺点:这个阶段允许在初始化过程中执行业务逻辑,但需要谨慎处理与初始化过程的关系。

🎷 9. 调用BeanPostProcessorpostProcessAfterInitialization方法:

  • 作用:如果Bean实现了BeanPostProcessor接口,容器将在初始化方法之后调用此方法,允许对Bean进行后处理。
  • 使用场景:当需要在Bean初始化后对Bean进行额外的处理,例如AOP代理、属性设置等,可以实现此接口。
  • 优缺点:这个阶段允许在Bean初始化后进行额外的处理,但需要注意不要破坏Bean的状态。

🎷 10. Bean的使用:

  • 作用:Bean已经准备好可以被应用程序使用。
  • 使用场景:在这个阶段,应用程序可以开始使用Bean的功能,进行业务逻辑操作。

🎷 11. 调用DisposableBeandestroy方法:

  • 作用:如果Bean实现了DisposableBean接口,容器将在容器关闭时调用此方法,执行销毁操作。
  • 使用场景:当需要在Bean被销毁前执行清理操作,例如释放资源、关闭连接等,可以实现此接口。
  • 优缺点:这个阶段允许在容器关闭前执行清理操作,但与Spring API的耦合度较高。

🎷 12. 调用自定义的销毁方法:

  • 作用:调用Bean定义中指定的自定义销毁方法,执行特定的销毁逻辑。
  • 使用场景:当需要在Bean销毁阶段执行特定的业务逻

辑时,可以通过配置自定义的销毁方法。

  • 优缺点:这个阶段允许在销毁过程中执行业务逻辑,但需要注意不要破坏销毁过程的完整性。

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

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

相关文章

SQL查询本年每月的数据

--一、以一行数据的形式,显示本年的12月的数据,本示例以2017年为例,根据统计日期字段判断,计算总和,查询语句如下:selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…

15个关于AI的Github库

这里是我们精选的创新项目列表(排名不分先后),这些项目正在机器学习和人工智能领域蓬勃发展 1:privateGPT 作者:imartinezGithub 星数:16.7K描述:利用LLM的力量,在没有互联网连接的情…

初探---Qt

目录 一、介绍Qt 二、软件安装 三、QT工具介绍 四、Assistant帮助文档的使用 五、设计师界面的介绍 ​编辑 六、QT工程项目各文件初始程序的介绍 1> 配置文件:.pro文件 2> 头文件 3> 源文件 4> 主程序 5> 各文件之间调用方式 七、第一个…

【LeetCode】双指针妙解有效三角形的个数

Problem: 611. 有效三角形的个数 文章目录 题目分析讲解算法原理复杂度Code 题目分析 首先我们来分析一下本题的思路 看到题目中给出的示例 题目的意思很简单,就是将给到的数字去做一个组合,然后看看这三条边是否可以构成三角形。那判断的方法不用我说&a…

【LeetCode75】第四十四题 省份数量

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一个二维数组,表示城市之间的连通情况,连在一起的城市为一个省份,问我们一共有多少个省份。 这…

CNN 01(CNN简介)

一、卷积神经网络的发展 convolutional neural network 在计算机视觉领域,通常要做的就是指用机器程序替代人眼对目标图像进行识别等。那么神经网络也好还是卷积神经网络其实都是上个世纪就有的算法,只是近些年来电脑的计算能力已非当年的那种计算水平…

【爬虫】7.2. JavaScript动态渲染界面爬取-Selenium实战

JavaScript动态渲染界面爬取-Selenium实战 爬取的网页为:https://spa2.scrape.center,里面的内容都是通过Ajax渲染出来的,在分析xhr时候发现url里面有token参数,所有我们使用selenium自动化工具来爬取JavaScript渲染的界面。 fr…

Swift 如何从图片数据(Data)检测原图片类型?

功能需求 如果我们之前把图片对应的数据(Data)保持在内存或数据库中,那么怎么从 Data 对象检测出原来图片的类型呢? 如上图所示:我们将 11 张不同类型的图片转换为 Data 数据,然后从 Data 对象正确检测出了原图片类型。 目前,我们的代码可以检测出 jpeg(jpg), tiff,…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能,怎么实现,提供一份整体逻辑:包括主函数和功能函数 主函数逻辑: 1. 读图,两张rgb(cv::imread) 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数:keypoints…

【2511. 最多可以摧毁的敌人城堡数目】

来源:力扣(LeetCode) 描述: 给你一个长度为 n ,下标从 0 开始的整数数组 forts ,表示一些城堡。forts[i] 可以是 -1 ,0 或者 1 ,其中: -1 表示第 i 个位置 没有 城堡。…

VMware 安装 Centos7 超详细过程

CentOS系统,安装教程可参考以下: 哪些模型需要在Linux下运行,需提前预装Linux系统呢,评论区讨论吧 比如Noah-MP 5.0模型 1.软硬件准备 软件:推荐使用 VMware,我用的是 VMware 12 镜像:CentO…

【python爬虫】10.指挥浏览器自动工作(selenium)

文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言 上一关,我们认识了cookies和session。 分别学习了它们的用法,以及区别。 还做了一个项目:带着小…

MTK6761/MT6761安卓核心板4G安卓智能模块详细参数性能介绍

MTK6761 安卓核心板采用12nm制程四核Cortex-A53、最高主频2.0GHZ 处理器,板载内存为 1GB8GB(2GB16GB、3GB32GB、4GB64GB),搭载Android 9.0操作系统。 MTK6761(曦力 A22)安卓核心板基本概述 MTK6761安卓核心板 是一款高性能低功耗…

HTML数字倒计时效果附源码

HTML页面代码 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content

【算法奥义】最大矩形问题

首先建立一个二维数组&#xff0c;这个二维数组&#xff0c;计算出矩阵的每个元素的左边连续 1 的数量&#xff0c;使用二维数组 left记录&#xff0c;其中left[i][j] 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。 也就是从这个元素开始&#xff0c;从右往左边数有多少个连…

Socks5代理 vs. Socks4代理:特点和区别解析

在网络通信中&#xff0c;使用代理服务器可以提供更安全、匿名的连接。其中&#xff0c;Socks5和Socks4是两种常见的代理协议。本文将深入探讨它们之间的特点和区别&#xff0c;帮助您选择适合自己需求的代理类型。 1.特点概述 -Socks5&#xff08;Socket Secure 5&#xff0…

SpringCloudGateway集成SpringDoc

SpringCloudGateway集成SpringDoc 最近在搞Spring版本升级&#xff0c;按客户要求升级Spring版本&#xff0c;原来用着SpringBoot 2.2.X版本&#xff0c;只需要升级SpringBoot 2.X最新版本也就可以满足客户Spring版本安全要求&#xff0c;可是好像最新的SpringBoot 2.X貌似也不…

【Apollo学习笔记】——规划模块TASK之SPEED_DECIDER

文章目录 前言SPEED_DECIDER功能简介SPEED_DECIDER相关配置SPEED_DECIDER流程MakeObjectDecisionGetSTLocationCheck类函数CheckKeepClearCrossableCheckStopForPedestrianCheckIsFollowCheckKeepClearBlocked Create类函数 前言 在Apollo星火计划学习笔记——Apollo路径规划算…

Java-API简析_java.net.Inet4Address类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132643590 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…