“简单”理解spring bean生命周期

本文持续更新中

有时候在想一个问题:如果一个Java开发仅仅会用某个框架(当然最典型的是Spring),那么随着工作经验、年龄的增加,很难继续留在这个行业。每年都有应届生涌入这个行业,如果一个人的工龄、年龄不断增加,但是技术实力和一个应届生之间没有太大的距离,那么势必会被淘汰掉,这是事物发展的规律。

说到Spring bean,其实不要上来就聊生命周期、启动流程之类的。我们应该进口Spring的两大核心IOC和AOP。这里不会解释什么是IOC或者AOP,这两个概念应该是最最最基础的概念(思想)。这两种思想在Spring中的体现都离不开Spring bean:其实Spring的很多概念都可以围绕Spring bean来加深理解。

对于Spring bean,可以把他做一个特殊的对象。只不过这个对象是Spring为我们进行管理--这是这个框架强大的功能体现。既然谈到了管理,那么就离不开生命周期:

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction

最重要的是前三个周期。至于启动流程,其实都是围绕springbean展开的,穿插在以上四个生命周期的前后,实现对bean的全方位管理。

然后带着设计的思维再往源码角度理解,如果不带着设计思维,很容易陷入细节的沼泽,到最后看的昏昏欲睡~

实例化:

为什么说这个生命周期很重要,这里就要深入到源码来加深理解,AbstractApplicationContext类中有个非常重要的方法refresh(),这个方法看着一堆流程(当然都有注释,不得不佩服作者的好习惯!),其实只需要先留意这个方法(实例化):

arduino 复制代码
// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);

管理bean,自然的离不开方法(method)。围绕以上四个阶段,延申出来了两种类型的方法:bean自身的方法和容器级的方法(这里的主要是PostProcessor)。其中容器级别的方法是属于容器的,独立于bean,并且创建每一个bean的过程中,都会启动作用。bean级的生命周期方法,主要是又aware。尤其针对于实例化前后、初始化前后,都有比较重要的后置处理器来进行额外的拓展性增强处理。

如果再细致下,bean级别的这里又分为自身的、拓展的(拓展的意思是该bean实现了特定的接口,这里我自己理解为是拓展的)。容器级别的主要是一堆post处理器;bean级别的有例如get set 构造方法等等,当然这是内部的,拓展出来的呢又有其他的,比较具有代表的就是ware(感知)接口,aware这类接口众多,想记住全部不太现实,其实我们只要理解了这类的作用就好。通常经常遇到beannameaware beanfactoryaware xxware接口等等,这些主要的作用是可以拿到xx资源,增加了灵活性,其实就是面向接口编程的重要体现。

相关推荐
SomeB1oody7 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
Profile排查笔记8 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户938515635078 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
爱学习的小邓同学9 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
小灰灰搞电子10 小时前
Rust+Slint 实现的“DNA双螺旋”加载动画源码分享
后端·rust·slint·加载动画
面向Google编程10 小时前
向量库不再囤数据:Milvus 3.0 零拷贝直读数据湖
后端
IT_陈寒12 小时前
Redis内存警告竟是因为这个不起眼的配置项
前端·人工智能·后端
Python私教12 小时前
AI 漫剧角色一进分镜就变脸?把提示词升级成“角色 ID + 镜头合同”
后端
Python私教12 小时前
一次生成 20 个角色却全都撞脸:我用“角色合同”重做了批量生成流程
后端
用户5944041035613 小时前
Go 语言高性能 Web 服务开发:基于 Gin + GORM + Redis 构建 RESTful API
后端