【SpringBoot】Bean的生命周期

简介: 面试官: 有了解过Bean的生命周期嘛?没有啊,行,那今天面试就到这里了

SpringBoot相关文章


生命周期

如果面试遇到这个问题的话,要先确定思路,第一反应应该围绕着一个核心状态转移流程。普通Java类-> BeanDefinition -> bean实例化-> 依赖注入-> bean初始化。

整个SpringBean的生命周期主要完成这几个状态的转变,按着具体的状态变化尽可能地用一些细节丰富自己的答案。

BeanDefinition

BeanDefinition是Spring提供的一个Bean对象的封装类,可以理解为一个创建Bean的前置对象,里面会存储一些bean的配置信息。如要加载bean的class信息、dependsOn信息(依赖某个类的加载),作用域等。

整个生命周期的第一步伴随着SpringBoot的启动流程,扫描整个classpath下所有标注对应注解的的类将其转换成BeanDefinition对象并存储对应元信息。

说了BeanDeinition就不得不清楚Spring是在那一步将Java类转换为BeanDefinition的,奥秘就在AbstractApplication中的refresh方法中。在"向容器中注入bean的几种方式"文章中也提到我们可以通过实现BeanDefinition相关的接口实现对bean的注入.


具体的代码就不贴了。我个人觉得没啥必要,八股文只要讲清思想就好,非要扣代码背流程没啥必要。再说那些类型晦涩难背,看一遍忘一遍还不如多看点别的。


实例化

实例化意思是只是底层是通过工厂+反射完成创建获得一个空对象,这也是解决循环依赖的一个很重要的点,在实例化前后分别由两个钩子方法。

  • 主要执行了Bean实例化之前会执行InstantiationAwareBeanPostProcess.postProcessBeforeInstantiation()方法
  • Bean实例化之后会执行InstantiationAwareBeanPostProcess.postProcessAfterInstantiation()方法

实例化后会向实例化出的空对象中注入依赖的对象,这里又是另外一个考点,spring bean如何解决循环依赖的,下一篇讲。

初始化

1.执行BeanPostProcessor接口的postProcessBeforeInitialization方法进行前置初始化。

2.检查是否实现了InitializingBean一些接口,如果实现了就调用afterPropertiesSet方法完成初始化,这样如果想在对象创建完之后调用其他bean的方法,可以通过afterPropertiesSet方法完成调用。

3.执行BeanPostProcessor后置处理接口ProcessAfterInitialization方法进行后置处理。比如一些扫描所有bean做一些建立后台任务的操作。


销毁

销毁主要看是否实现了DisposbleBean接口调用destroy方法,实现了的话会在销毁阶段调用,比如连接池关闭等操作都可以放在这里。


总结

  1. 首先大体分为四个阶段,beanDefine、实例化、依赖注入、初始化
  2. SpringBoot启动流程中会扫描对应的注解将对应的Java类配置成BeanDefinition并存到Map中
  3. 实例化前后主要会执行两个hook函数,postProcessBeforeInstantiation与postProcessAfterInstantiation函数。
  4. 初始化则判断是否实现BeanPostProcessor,检查检查是否实现了InitializingBean等接口调用对应的hook函数。
  5. 销毁调用DisposbleBean的destroy方法



相关文章
|
11天前
|
Java
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
32 2
|
1月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
1月前
|
Java Spring 容器
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
这篇文章讨论了在Spring Boot 3.2.1版本中,同名同类型的bean和@Service注解类之间冲突的问题得到了解决,之前版本中同名bean会相互覆盖,但不会在启动时报错,而在配置文件中设置`spring.main.allow-bean-definition-overriding=true`可以解决这个问题。
85 0
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
|
2月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
1月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
|
4月前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
103 11
|
4月前
|
消息中间件 Java Kafka
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
187 5
|
3月前
|
Java Spring 容器
Java SpringBoot 中,动态执行 bean 对象中的方法
Java SpringBoot 中,动态执行 bean 对象中的方法
40 0
|
3月前
|
Java Spring
Java SpringBoot Bean InitializingBean 项目初始化
Java SpringBoot Bean InitializingBean 项目初始化
54 0
|
4月前
|
文字识别 Java
文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建
文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建