一篇文章了解Java spring中bean的生命周期!

news2025/5/15 15:34:03

一.介绍在Java spring中bean的生命周期

1.什么是 Bean?

我们来看下 Spring Framework 的官方文档:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.

简而言之,bean 是由 Spring IoC 容器实例化、组装和管理的对象。

2.Java spring中bean的生命周期是什么?

在Java Spring中,Bean的生命周期是指一个Bean从被实例化到最终被销毁的整个过程。Spring容器负责管理Bean的生命周期,并在特定时机触发相应的回调方法。

3.Bean的生命周期包括以下几个关键阶段:

  1. 实例化(Instantiation):在这个阶段,Spring容器根据配置或注解创建Bean的实例对象。

  2. 属性赋值(Population):在实例化后,Spring容器将通过依赖注入(Dependency Injection)或属性设置将相关属性值传递给Bean。

  3. 初始化回调(Initialization Callback):在属性赋值完成后,如果Bean实现了InitializingBean接口,Spring容器会调用其afterPropertiesSet()方法。同时,还可以通过在配置文件中指定init-method来指定初始化方法。

  4. 使用中(In Use):在初始化完毕后,Bean可以被应用程序正常使用,执行相应的业务逻辑。

  5. 销毁回调(Destruction Callback):当Bean不再需要时,Spring容器会在适当的时候触发销毁回调方法。如果Bean实现了DisposableBean接口,Spring容器会调用其destroy()方法。另外,也可以通过在配置文件中指定destroy-method来指定销毁方法。

需要注意的是,并非所有Bean都需要实现InitializingBeanDisposableBean接口或通过配置指定初始化和销毁方法。这些操作是可选的,可以根据需要选择是否使用。此外,还可以使用注解驱动的方式,如@PostConstruct@PreDestroy注解,来定义初始化和销毁方法。

通过生命周期回调方法,我们可以在Bean的不同阶段执行自定义逻辑,例如进行初始化设置、资源加载、连接数据库等。Spring的生命周期管理能够帮助我们更好地控制Bean的创建、初始化和销毁过程,提高应用程序的灵活性和可维护性。

 4.Java spring中bean的生命周期会使用到应用场景

在Java Spring中,Bean的生命周期可以应用于以下场景:

  1. 初始化配置:在Bean实例化和初始化阶段,可以执行一些初始化配置的操作,例如加载配置文件、连接数据库、初始化缓存等。

  2. 依赖注入:在Bean的属性赋值阶段,可以进行依赖注入,将其他Bean所需要的依赖项自动注入到目标Bean中。

  3. 自定义逻辑:通过在Bean的生命周期中定义回调方法,可以执行自定义的业务逻辑。例如,在初始化前后执行一些额外的逻辑操作,或者在销毁前后进行资源清理。

  4. 资源管理:可以在Bean的销毁阶段,释放占用的资源,如关闭数据库连接、释放文件句柄、停止定时任务等。

  5. AOP(面向切面编程):可以利用Bean的生命周期回调方法,在特定的时间点织入AOP切面逻辑,例如在初始化之后执行一些切面操作。

  6. 第三方库集成:当使用某些第三方库时,可能需要在Bean的生命周期中进行初始化和销毁操作,以确保库的正确使用和释放。

总结来说,Java Spring中Bean的生命周期可以应用于初始化配置、依赖注入、自定义逻辑、资源管理、AOP和第三方库集成等场景。它可以帮助我们更好地管理和控制Bean的创建、初始化和销毁过程,提高应用程序的可维护性和可扩展性。 


二. Java spring 中常用接口说明

2.1 BeanNameAware

该接口只有一个方法 setBeanName(String name),用来获取 bean 的 id 或者 name。

2.2 BeanFactoryAware

该接口只有一个方法 setBeanFactory(BeanFactory beanFactory),用来获取当前环境中的 BeanFactory。

2.3 ApplicationContextAware

该接口只有一个方法 setApplicationContext(ApplicationContext applicationContext),用来获取当前环境中的 ApplicationContext。

2.4 InitializingBean

该接口只有一个方法 afterPropertiesSet(),在属性注入完成后调用。

2.5 DisposableBean

该接口只有一个方法 destroy(),在容器销毁的时候调用,在用户指定的 destroy-method 之前调用。

2.6 BeanPostProcessor

该接口有两个方法:

postProcessBeforeInitialization(Object bean, String beanName):在初始化之前调用此方法
postProcessAfterInitialization(Object bean, String beanName):在初始化之后调用此方法
通过方法签名我们可以知道,我们可以通过 beanName 来筛选出我们需要进行个性化定制的 bean。

2.7 InstantiationAwareBeanPostProcessor

该类是 BeanPostProcessor 的子接口,常用的有如下三个方法:

postProcessBeforeInstantiation(Class beanClass, String beanName):在bean实例化之前调用
postProcessProperties(PropertyValues pvs, Object bean, String beanName):在bean实例化之后、设置属性前调用
postProcessAfterInstantiation(Class beanClass, String beanName):在bean实例化之后调用

三.如何去验证生命周期

1.关系图

 2.对于关系图的解释

2.1Spring Bean的生命周期:

1.通过XML、Java annotation(注解)以及Java Configuration(配置类)

等方式加载Spring Bean

2.BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中,

会将Bean解析成Spring内部的BeanDefinition结构;

理解为:将spring.xml中的<bean>标签转换成BeanDefinition结构

有点类似于XML解析

3.包含了很多属性和方法。例如:id、class(类名)、

scope、ref(依赖的bean)等等。其实就是将bean(例如<bean>)的定义信息

存储到这个对应BeanDefinition相应的属性中

例如:

<bean id="" class="" scope=""> -----> BeanDefinition(id/class/scope)

4.BeanFactoryPostProcessor:是Spring容器功能的扩展接口。

注意:

4.1BeanFactoryPostProcessor在spring容器加载完BeanDefinition之后,

在bean实例化之前执行的

4.2对bean元数据(BeanDefinition)进行加工处理,也就是BeanDefinition

属性填充、修改等操作

5.BeanFactory:bean工厂。它按照我们的要求生产我们需要的各种各样的bean。

例如:

BeanFactory -> List<BeanDefinition>

BeanDefinition(id/class/scope/init-method)

<bean class="com.zking.spring02.biz.BookBizImpl"/>

foreach(BeanDefinition bean : List<BeanDefinition>){

   //根据class属性反射机制实例化对象

   //反射赋值设置属性

}

6.Aware感知接口:在实际开发中,经常需要用到Spring容器本身的功能资源

例如:BeanNameAware、ApplicationContextAware等等

BeanDefinition 实现了 BeanNameAware、ApplicationContextAware

7.BeanPostProcessor:后置处理器。在Bean对象实例化和引入注入完毕后,

在显示调用初始化方法的前后添加自定义的逻辑。(类似于AOP的绕环通知)

前提条件:如果检测到Bean对象实现了BeanPostProcessor后置处理器才会执行

Before和After方法

BeanPostProcessor

1)Before

2)调用初始化Bean(InitializingBean和init-method,Bean的初始化才算完成)

3)After

完成了Bean的创建工作

8)destory:销毁

 3.spring容器管理javabean的初始化过程

1.xml/annotation/configuation 配置JavaBean
2.BeanDefinitionReader解析配置的Javabean得到BeanDefinition最终得到List<BeanDefinition>集合
3.触发BeanFactoryPostProcessor,在Javabean初始化之前执行自己的业务
spring中的beanFactory,会通过List<BeanDefinition>集合遍历初始化所有的Javabean对象
如果javabean需要调动spring上下文的资源,那么需要实现Aware感知接口 
4.如果自己的javabean以及初始化好了,还需要扩展功能,那么还需要借助BeanFactoryPostProcessor来实现 

4.通过IDEA模拟测试数据

1.建立一个模拟数据(并且解析spring配置的xml文件)

package com.lz.beanLife;

import org.springframework.beans.factory.config.BeanDefinition;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lz
 * @create 2023-08-18 14:39
 */
public class demo1 {
    public static void main(String[] args) {
        //解析spring-context 内容
        List<BeanDefinition> beans = new ArrayList<BeanDefinition>();
       //遍历解析
        for (BeanDefinition  bean: beans) {
            String beanClassName = bean.getBeanClassName();
            try {
                Class.forName(beanClassName);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

    }
}
class   User{

}
class   Person{
     private   int  pid;
     private   String  pname;
     private   String  sex;
     private    User   user;

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Person(int pid, String pname, String sex) {
        this.init();
        this.pid = pid;
        this.pname = pname;
        this.sex = sex;
    }


    public Person() {
    }

    @Override
    public String  toString() {
        return "Person{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
   public void init() {

    }
}

2.spring需要配置的xml文件

<bean id="paramAction" class="com.lz.beanLife.ParamAction">
        <constructor-arg name="name" value="刘兵sb"></constructor-arg>
        <constructor-arg name="age" value="21"></constructor-arg>
        <constructor-arg name="hobby">
            <list>
                <value>抽烟</value>
                <value>烫头</value>
                <value>大保健</value>
            </list>
        </constructor-arg>
    </bean>

    <bean id="instanceFactory" class="com.lz.beanLife.InstanceFactory"
          scope="prototype" init-method="init" destroy-method="destroy"></bean>

3.响应图片单例模式

 

5.总结spring中Javabean是单例还是多例

1.默认是单例,但是可以配置多例
2.单例  的优点是节约内存,弊端有变量污染!
多例  的优点是无变量污染,弊端消耗内存!
3.单例javabean是跟着spring上下文初始化的,同生共死!
多例javabean使用才会初始化

 

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

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

相关文章

xcode14.3更新一系列问题

1. Missing file libarclite_iphoneos.a (Xcode 14.3) 解决方法 Xcode升级到14.3后编译失败&#xff0c;完整错误日志&#xff1a; File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneo…

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

linux训练深度学习模型:文件基本操作

解压.zip unzip XXX.zip 创建目录&#xff1a; mkdir data 在当前目录下创建下一级目录 移动文件&#xff1a; mv /data1/census.csv /data1/data 要写全目录路径&#xff0c;不然会跑到根目录那里去。 复制文件到当前目录下&#xff0c;并重命名 cp main.py ./main…

CSS基础 知识点总结

一.CSS简介 1.1 CSS简介 ① CSS指的是层叠样式表&#xff0c;用来控制网页外观的一门技术 ② CSS发展至今&#xff0c;经历过CSS1.0 CSS2.0 CSS2.1 CSS3.0这几个版本&#xff0c;CSS3.0是CSS最新版本 1.2 CSS引入方式 ① 在一个页面引入CSS&#xff0c;共有三种方式 外部…

《一个操作系统的实现》windows用vm安装CentOS——从bochs环境搭建到第一个demo跑通

vm安装CentOS虚拟机带有桌面的版本。su输入密码123456。更新yum -y update 。一般已经安装好后面这2个工具&#xff1a;yum install -y net-tools wget。看下ip地址ifconfig&#xff0c;然后本地终端连接ssh root192.168.249.132输入密码即可&#xff0c;主要是为了复制网址方便…

基于SOLIDWORKS配置功能建立塑料模具标准件库

在塑料模具的设计过程中&#xff0c;建立其三维模型对于后续进行CAE分析和CAM加工是非常重要的。除了型腔和型芯以外&#xff0c;塑料模具中的标准件很多&#xff0c;如推杆、导柱、导套、推板、限位钉等&#xff0c;这些对于不同的产品是需要反复调用的。目前&#xff0c;我国…

GWAS-eQTL colocalization analysis workflow

1. The purpose of GWAS-eQTL intergration Is the my variant an eQTL?Is the leading variant of the GWAS and eQTL signal the same?Is my GWAS association of interest driven by an eQTL that may indiciate a functinal mechanism? GWAS locus that colocalized w…

IntelliJ IDEA 官方网站 idea官网 http://www.jetbrains.com/idea/

IntelliJ IDEA 官方网站 idea官网 http://www.jetbrains.com/idea/ Idea下载官网一键直达&#xff1a; 官网一键直达

低代码揭秘:企业开发能力提升的秘诀!

从捷码官网获取的捷码产品体验账号&#xff0c;用浏览器打开下列地址即可&#xff08;推荐电脑端哈&#xff09;&#xff0c;需要自取&#xff1a; http://dev.gemcoder.com/front/development/index.html#/officialLogin?jmcmVnaXN0ZXI9dHJ1ZQ%3D%3D 对于很多软件开发企业来说…

北京筑龙智能物料:企业供应链数字化转型新思路

8月16-18日&#xff0c;由中国物流与采购联合会主办的“2023&#xff08;第十五届&#xff09;物流与供应链数字化发展大会”在贵州省贵阳市召开。北京筑龙智能化事业部总经理、筑龙研究院副院长胡婧玥受邀出席&#xff0c;带来主题为“智能物料——企业供应链数字化转型新思路…

Windows定时任务计划无法显示任务程序界面的问题解决

笔者这两天写了一个python脚本程序&#xff0c;用来自动从公司的主数据系统获取数据&#xff0c;并按格式编制成excel。脚本程序编写一切顺利&#xff0c;运行结果很是完美&#xff0c;笔者很是舒心。但在最后一步&#xff0c;用上班的电脑每天早上定时运行它时&#xff0c;出了…

msvcp110.dll丢失原因,msvcp110.dll丢失修复方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…

Python OpenGL环境配置

1.Python的安装请参照 Anconda安装_安装anconda_lwb-nju的博客-CSDN博客anconda安装教程_安装ancondahttps://blog.csdn.net/lwbCUMT/article/details/125322193?spm1001.2014.3001.5501 Anconda换源虚拟环境创建及使用&#xff08;界面操作&#xff09;_anconda huanyuan_l…

数据库索引优化策略与性能提升实践

文章目录 什么是数据库索引&#xff1f;为什么需要数据库索引优化&#xff1f;数据库索引优化策略实践案例&#xff1a;索引优化带来的性能提升索引优化规则1. 前导模糊查询不适用索引2. 使用IN优于UNION和OR3. 负向条件查询不适用索引4. 联合索引最左前缀原则5. 范围条件查询右…

回到未来:使用马尔可夫转移矩阵分析时间序列数据

一、说明 在本文中&#xff0c;我们将研究使用马尔可夫转移矩阵重构时间序列数据如何产生有趣的描述性见解以及用于预测、回溯和收敛分析的优雅方法。在时间上来回走动——就像科幻经典《回到未来》中 Doc 改装的 DeLorean 时间机器一样。 注意&#xff1a;以下各节中的所有方程…

用KMP的方法解决《重复的子字符串》

提出问题 给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两次构成。 示例 2: 输入: “aba” 输出: Fa…

eqtl-GWAS和GWAS-GWAS

目前教程中有eqtl-GWAS和GWAS-GWAS两种模式&#xff0c;其他模式比较少见&#xff0c;还未进行开发 数据类型cc为分类变量即case/control&#xff0c;quant为连续变量&#xff0c;eqtl数据默认quant coloc.abf有两个比较需要注意的点&#xff0c;就是数据集中N是代表样本量&am…

你真的了解你的交易吗?不妨了解下KYT

作者&#xff5c;Jason Jiang 随着行业高速发展与监管持续关注&#xff0c;虚拟资产领域正加速迈入合规时代。为应对虚拟资产的链上洗钱风险&#xff0c;欧科云链此前推出了Onchain AML合规技术方案&#xff0c;以助力行业健康有序发展。在Onchain AML反洗钱方案中&#xff0c;…

c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

【卡码网】32. 子矩形的最大面积 <模拟>

【卡码网】32. 子矩形的最大面积 给定一个矩形&#xff0c;宽度为 W&#xff0c;高度为 H&#xff0c;现需要对其进行划分。现有一个数组 yCutting 用于表示在水平方向上用于切分矩形的切线位置&#xff0c;另有一个数组 xCutting 表示在垂直方向上用于切分矩形的切线位置。求…