Spring学习 之Bean生命周期

学习spring Bean的生命周期 这是一个Spring框架学习项目,主要演示了IoC容器的基础使用和核心功能。项目结构包含实体类(Address、Person)、后置处理器(MyBeanPostProcessor)和多种工厂模式实现(静态工厂、实例工厂、FactoryBean)。通过ioc.xml配置文件实现了依赖注入、Bean作用域测试和生命周期管理,并集成了Druid数据源配置。测试类MyTest验证了从容器获取Bean、工厂创建对象等功能。项目覆盖了Spring的核心概念,包括单例模式、依赖注入、后置处理器和多种工厂模式等关键技术点。 阅读详情

怎么回答 Bean 的生命周期

实例化、属性赋值、初始化、销毁。
1、实例化: 根据配置中的 BeanDefinition 实例化 Bean。调用了Bean的构造函数。
2、属性赋值: Spring 使用依赖注入(构造器或者setter)填充所有属性。
3、初始化之前: 调用 BeanPostProcessors 实现类并注入到容器中的Bean的初始化之前方法。
4、初始化: 调用初始化方法,如果指定了初始化方法。
5、初始化之后: 调用 BeanPostProcessors 实现类并注入到容器中的Bean的初始化之后方法。
6、销毁: 当容器关闭时,调用指定的销毁方法。

生命周期流程图

在这里插入图片描述

流程简述

1、[容器级]BeanFactoryPostProcessor接口: 如果spring配置文件注册了该接口的实现类,可以在spring的bean创建之前,修改bean的定义属性。例如可以把bean的scope从singleton改为prototype。
2、[容器级]InstantiationAwareBeanPostProcessor接口: 初始化Bean之前的预处理;
3、初始化Bean
4、[容器级]InstantiationAwareBeanPostProcessor接口: 如果spring配置文件注册了该接口的实现类,Spring将调用它们的postProcessPropertyValues方法;
5、注入: Spring根据定义信息(beanDifinition)将值和引用bean注入到bean对应的属性中;
6、[Bean级]感知类名: 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
7、[Bean级]感知容器: 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来。注:BeanFactory容器查找实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入.
8、[容器级]BeanPostProcessor: 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
9、[Bean级]InitializingBean: 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。
10、[Bean自身方法]init-method: 如果bean定义中使用指定了init-method初始化方法,该方法也会被调用;
11、[容器级]BeanPostProcessor: 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
12、[容器级/后处理器]InstantiationAwareBeanPostProcessor : 如果bean实现了InstantiationAwareBeanPostProcessor 接口,Spring将调用它们的postProcessAfterInitialization()方法;

此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;

13、[Bean级]DisposableBean: 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。
14、[Bean自身方法]destroy-method: 如果bean定义中使用destroy-method声明了销毁方法,该方法也会被调用。

演示Spring Bean的生命周期

InstantiationAwareBeanPostProcessor接口实现:

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    /**
     * BeanPostProcessor 接口中的方法
     * 在Bean的自定义初始化方法之前执行
     * Bean对象已经存在了
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的初始化之前:" + beanName);
        return bean;
    }
    /**
     * BeanPostProcessor接口中的方法
     * 在Bean的自定义初始化方法执行完成之后执行
     * Bean对象已经存在了
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的初始化之后:" + beanName);
        return bean;
    }
    /**
     * InstantiationAwareBeanPostProcessor中自定义的方法
     * 在方法实例化之前执行  Bean对象还没有
     */
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("拦截到Bean的实例化之前:" + beanName);
        return null;
    }
    /**
     * InstantiationAwareBeanPostProcessor中自定义的方法
     * 在方法实例化之后执行  Bean对象已经创建出来了
     */
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的实例化之后:" + beanName);
        return true;
    }
}

BeanPostProcessor 接口实现:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的初始化之前:" + beanName);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的初始化之后:" + beanName);
        return bean;
    }
}

业务类:

@Component
public class Person implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
    private ApplicationContext applicationContext;
    public Person() {
        System.out.println("执行Bean构造函数进行实例化:person");
    }
    @Override
    public void setBeanName(String beanName) {
        System.out.println("setBeanName:" + beanName);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("setApplicationContext");
        this.applicationContext = applicationContext;
    }
    @PostConstruct
    public void postConstruct() {
        System.out.println("@PostConstruct注解方法");
    }
    @PreDestroy
    public void preDestroy() {
        System.out.println("@PreDestroy注解方法");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("实现InitializingBean接口的方法afterPropertiesSet");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("实现DisposableBean接口的方法destroy");
    }
}

测试:

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("org.example");
        applicationContext.close();
    }
}

运行结果:
在这里插入图片描述

BeanDefinition阶段

在 bean 的创建之前,bean 是以 BeanDefinition 的方式被描述和注册在 BeanFactory 的,这个时候虽然 bean 还没有被创建,但是 BeanFactory 中已经存有 bean 对应的 BeanDefinition 了,所以在 bean 的实例化之前,还应该有 BeanDefinition 阶段。
首先,bean 的生命周期分为 BeanDefinition 阶段和 bean 实例化阶段。(能在 bean 的生命周期中回答出 BeanDefinition 非常重要,是加分项!)

BeanDefinition 部分

  • BeanDefinition 的解析(加载 xml 配置文件、解析注解配置类、编程式注入)
  • BeanDefinition 的注册(注册到 BeanDefinitionRegistry)

bean 实例部分

  • bean 的实例化(Bean的构造函数)
  • bean 的属性赋值 + 依赖注入(处理 <bean> 中的 <property> 标签、bean 中的 @Value 、@Autowired 等自动注入的注解)
  • bean 的初始化流程
  • bean 的启动与停止
  • bean 的销毁

Bean实例化阶段

InstantiationAwareBeanPostProcessor接口实现的实例化方法之前
Bean的构造函数
InstantiationAwareBeanPostProcessor接口实现的实例化方法之后

Bean初始化阶段

Bean 对象实例化完成后,进入到初始化阶段,会进行属性赋值、组件依赖注入,以及初始化阶段的方法回调。
在属性赋值、依赖注入阶段,会事先收集好 Bean 中标注了依赖注入的注解( @Autowired 、@Value 、@Resource 、@Inject ),之后会借助后置处理器的初始化之前方法实现属性赋值、依赖注入。

属性赋值和依赖注入之后,会回调执行 Bean 的初始化方法,以及后置处理器的逻辑:首先会执行 Aware 相关的回调注入,之后执行后置处理器的前置回调,在后置处理器的前置方法中,会回调 bean 中标注了 @PostConstruct 注解的方法,所有的后置处理器前置回调后,会执行 InitializingBean 的 afterPropertiesSet 方法,随后是 init-method 指定的方法,等这些 bean 的初始化方法都回调完毕后,最后执行后置处理器的后置回调。

Bean销毁阶段

Bean 对象在销毁时,由 ApplicationContext 发起关闭动作。
由 BeanFactory 取出所有单实例 bean ,并逐个销毁。

先将当前 Bean 依赖的所有 Bean 都销毁。
随后回调自定义的 Bean 的销毁方法。
之后如果 bean 中有定义内部 bean 则会一并销毁。
最后销毁那些依赖了当前 bean 的 bean 也一起销毁。

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案) 本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。 阅读详情

相关推荐

薄膜电容寿命预测全解析:从理论到实践,5步搞定可靠性评估

本文全面解析薄膜电容寿命预测的理论与实践,提供五步可靠性评估流程,涵盖温度应力、电压应力等关键因素分析,并分享提升寿命的实用技巧。特别适用于新能源、电动汽车等领域的设计工程师,帮助准确预测薄膜电容在实际工况下的使用寿命。

weixin_33712987的博客 433

bean的生命周期(最全最细讲解)

其定义为:从对象的创建到销毁的过程。而Spring中的一个Bean从开始到结束经历很多过程,但总体可以分为六个阶段Bean定义、实例化、属性赋值、初始化、生存期、销毁。 2.SpringBean生命周期中的增强接口PostProcessor;postProcessBeforeInitialization方法执行前,会执行很多Aware类型的接口,这种类型接口作用是加载资源到Spring容器中。我们在创建一个MyBeanPost的类来实现BeanPostProcessor接口。 ​ ......

a910247的博客 4万+

别再手动算了!用Excel函数一键搞定AQI和首要污染物分析(附完整公式模板)

本文介绍如何利用Excel函数自动化计算AQI和首要污染物分析,大幅提升数据处理效率。通过构建标准化输入模板、智能计算IAQI、自动判定AQI与首要污染物,并生成可视化仪表盘,帮助环保工作者快速完成每日监测报告。

weixin_30443075的博客 345

详解Bean的生命周期

Spring bean生命周期13个环节 阶段1:Bean元信息配置阶段 阶段2:Bean元信息解析阶段 阶段3:将Bean注册到容器中 阶段4:BeanDefinition合并阶段 阶段5:Bean Class加载阶段 阶段6:Bean实例化阶段(2个小阶段) Bean实例化前阶段 Bean实例化阶段 阶段7:合并后的BeanDefinition处理 阶段8:属性赋值阶段(3个小阶段) Bean实例化后阶

真是适合睡觉的天气 3515

HyperLynx VX2.5 实战:5分钟搞定LPDDR4X内存的批量仿真与报告分析

本文详细介绍了如何使用HyperLynx VX2.5进行LPDDR4X内存的批量仿真与报告分析,通过智能网络分组和并行计算技术,5分钟内即可完成全流程验证。文章涵盖工程准备、批量仿真配置、报告解析及典型问题解决方案,帮助工程师高效提升PCB仿真效率,确保移动设备内存接口的稳定性与性能。

weixin_42683394的博客 401

Agile Modbus使用和学习笔记

i < len;这里仅仅需要提供获取函数即可,离散输入是只读类型i++) {return 0;只读类型寄存器i++) {return 0;i < len;

Car12 168

0107Bean初始化-Bean生命周期详解-spring

0107Bean初始化-Bean生命周期详解

gaogzhen的博客 462

Qt5.15.7编译报错问题汇总:python2安装环境导致的问题

导致编译生成的:RegExpJitTables.h文件大小为0。RegExpJitTables.h 能生成且大小不为0KB。可以看到,正确的python路径,执行编译路径后。再执行 configure XXX…尝试直接改,将其改为正确的路径。

MusicScore的博客 1439

Bean的生命周期

目录一,bean的初始化(1)Spring的IOC和AOP:(2)Spring Bean的生命周期:二,单例模式与多例模式的区别区别 《代码演示》前言 如图 《代码测试》在正式初始化之前会调用init方法,而我调用的this.init();方法会有专门的人员来写,就是BeanFactoryPostProcessor《提取代码》 《整体代码》 二,单例模式与多例模式的区别 区别 num的值不一样,是由一个类创建了两个对象,但是两个对象是同一个对象,这就是单例 配置文件

weixin_66202611的博客 1177

LSTM 深度解析从原理推演到现代序列建模的演进

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),它通过引入记忆单元(Cell State)来解决普通RNN在长序列数据处理中的梯度消失问题。LSTM可以在长时间的序列中捕捉依赖关系,是一种非常适合处理时间序列、自然语言处理、语音识别等任务的深度学习模型。在LSTM中,记忆单元(Cell State)是一个贯穿整个序列的数据通道,用于存储和传递关键信息。记忆单元在LSTM的时间步之间保持信息的持久性,可以看作是一个长期记忆的“容器”。

hello.reader 3万+

IPCP(IP Control Protocol,IP控制协议)

IPCP(IP Control Protocol,IP控制协议)

天赐好车的博客 757

Bean的生命周期详解

第一步:启动ApplicationContext 第二步:创建BeanFactory工厂 第三步:初始化BeanFactory 1、解析配置类,得到BeanDefinition,并注册到BeanFactory中 i. 解析@ComponentScan,此时就会完成扫描 ii. 解析@Import iii. 解析@Bean 2、 因为ApplicationContext还支持国际化,所以还需要初始化MessageSource对象 3、 因为ApplicationContext

m0_57237237的博客 564

SAP Fiori Launchpad Tile,UI5 应用,和 PFCG Role 的对应关系

问题:已经看到了SAP Fiori Launchpad上的某个tile,如何反推后台需要配置哪个PFCG Role才能看到该tile? 这个问题是今天一个朋友在微信上问我的。因为我最近忙着学习一个新的SAP产品,所以这个问题也没有时间展开来写,本文就只做概要介绍。 下图是一个Gateway系统上打开的SAP CRM Fiori Launchpad: 如何弄清楚后台用户配置了哪个PFCG Role之后,才能看到Sales Representative(CRM)这个Group下的tile? 既然当前我使用的用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1520

Spring学习笔记7 Bean的生命周期

如果是prototype作用域的Bean,Spring容器只负责将该Bean初始化完毕.等客户端程序一旦获取到该Bean之后,Spring容器就不再管理该对象生命周期。有时候可能会遇到这样的需求,某个java对象是我们自己new的,然后我们希望这个对象被Spring容器管理,怎么实现.当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean。Spring其实就是一个管理Bean对象的工厂.它负责对象的创建,对象的销毁.就是又增加了三个接口。

tiantiantbtb的博客 282

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring Bean生命周期学习

目录1. 概述2. 相关注解3. Bean的生命周期流程图序列图4. 演示4.1 User.java4.2 MyBeanFactoryPostProcessor.java4.3 MyBeanPostProcessor.java4.4 MyInstantiationAwareBeanPostProcessor.java4.5 DemoApplication.java4.6 运行程序,查看运行结果 文章参考地址,补充并优化了些内容 1. 概述 什么是Bean 被称作 bean 的对象是构成应用程序的支柱

森伯416的博客 272

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

spring源码学习 三:Bean的生命周期

这一篇文章我们来看看Bean的生命周期,以及从Bean的生命周期中可以学到的设计模式。

nichilemei的博客 1374

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring学习之 Bean的生命周期

Bean的作用域、生命周期 转自:http://www.cnblogs.com/zrtqsk/p/3735273.html Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例)、prototype(原型)、request、session和global session,5种作用域说明如下: singleton:单例模式,Spring IoC容器中只会存在一...

weixin_44729253的博客 123

Spring学习——Bean的生命周期

Bean的生命周期 1、生命周期 Bean创建 —>初始化—>销毁的过程,在这个过程中可以做一些拓展 2、bean的生命周期 通过无参构造器创建bean实例 为bean设置属性值和对其他bean的引用 bean初始化前做操作,BeanPostProcessor中的方法 调用bean的初始化方法 bean初始化后做操作,BeanPostProcessor中的方法 可以使用bean 关闭容器,销毁容器 没有使用BeanPostProcessor中的方法的示例 public class Order

lwd18175239125的博客 122

Spring学习之Bean的生命周期

Bean的生命周期对于Spring的的学习至关重要,其对于Spring的深入学习有着不可忽略的作用,下面便是我在学习Spring中对Bean生命周期的总结。 一、文字说明 二、图解

u014285979的博客 326

深入学习Spring Bean生命周期

所谓Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。一个完整的Bean生命周期可以参考Spring Bean生命周期。这里我们主要记录一些和Bean生命周期相关的细节。 Bean的初始化和销毁 在整个生命周期过程中,我们可以自定义Bean的初始化和销毁钩子函数,当Bean的生命周期到达相应的阶段的时候,Spring会调用我们自定义的Bean...

一只倔强的蜗牛的博客 254

spring学习-bean的生命周期

spring的两个核心:BeanFactory(心脏,本身使用)与ApplicationContext(身躯,面向spring框架开发者) 一、BeanFactory中的Bean的生命周期   首先看一下BeanFactory的体系结构 对其中的几个重要接口进行简单介绍 BeanFactory:主要是从容器中获取bean类,通过getBean(String beanName) Lis...

南小瓜的专栏 502

spring源码学习之Bean的生命周期

1.代码注入我们自己的Bean,跟进spring源码解析 引入我们的配置类: //配置类 === 配置文件 @Configuration public class MainConfig { //给容器配置一个bean,类型为返回值的类型 @Bean("abcPerson") public Person person(){ return new Person...

weixin_43860962的博客 151

Spring学习笔记:Spring中Bean的生命周期

本文介绍了Spring框架中Bean的生命周期,包括实例化、属性赋值、初始化、使用和销毁五个阶段。每个阶段详细说明了Spring容器的处理逻辑和关键扩展点,如依赖注入、Aware接口回调、BeanPostProcessor处理等。文章通过餐厅招聘厨师的通俗比喻,帮助理解Bean从创建到销毁的完整过程,并强调了合理控制生命周期对资源管理的重要性。

zyyyyyhhhhh的博客 889

Spring的学习01(spring的核心容器,bean的获取,作用范围以及生命周期)

Spring的学习01(spring的核心容器,bean的获取,作用范围以及生命周期) 1.spring的三种核心容器的获取,以及BeanFactory和ApplicationContext区别 * 获取spring容器的Ioc核心容器,并获得id对象 * ApplicationContext三个常用的实现类 * ClassPathXmlApplicationContext 类路径下的配...

qq_43445553的博客 212

spring学习(bean的生命周期与控制?)

本篇博客的内容:学习spring中有关bean生命周期的内容。其中还包括学习了如何控制bean生命周期?以及bean生命周期销毁的操作方式...

岁岁岁平安的博客 1216

【Spring学习】Bean生命周期

我理解的Bean生命周期包括两个方面: Bean何时创建,何时销毁 Bean从创建到销毁的执行流程 一、Bean创建与销毁       Bean的创建时机主要由几个配置项共同来决定,包括: scope属性,决定是Bean是单例模式(singleton)还是多例模式(prototype),默认为单例singleton; lazy-init属性,只对单例模式有效,决定是否延时加载,默认为false,表示

pur_e的专栏 7928
上一篇: Spring学习 之四种XML配置注入方式
下一篇: Spring学习 之容器扩展点:FactoryBean
yyangqqian
博客等级 码龄15年 406粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值