Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第37讲 | 谈谈Spring Bean的生命周期和作用域?

ApplicationContextAware
BeanFactoryAware
BeanNameAware
提供一个全局性的HTTP Session
Bean实例的作用域是Session范围
为每个HTTP请求创建单独的Bean实例
针对每个getBean请求,容器都会单独创建一个Bean实例
为每个IOC容器创建唯一的一个Bean实例
调用Bean自身定制的destroy方法
调用DisposableBean的destroy方法
调用BeanPostProcessor的后置初始化方法postProcessAfterInitialization
调用Bean自身定义的init方法
调用InitializingBean接口的afterPropertiesSet方法
调用BeanPostProcessor的前置初始化方法postProcessBeforeInitialization
注入Bean对容器基础设施层面的依赖
设置Bean属性
实例化Bean对象
依赖注入(Dependency Injection)
GlobalSession (Portlet容器)
Session (Web容器)
Request (Web容器)
Prototype
Singleton
销毁过程
创建过程
Advice
Pointcut
Join Point
Aspect
Spring Data
Spring Security
Spring Cloud
Spring Boot
AOP
控制反转(Inversion of Control)
Spring Bean的作用域
Spring Bean的生命周期
Spring AOP的设计和实现细节
Spring的范围
Spring基础机制
Spring Bean的生命周期和作用域

该思维导图由 AI 生成,仅供参考

在企业应用软件开发中,Java 是毫无争议的主流语言,开放的 Java EE 规范和强大的开源框架功不可没,其中 Spring 毫无疑问已经成为企业软件开发的事实标准之一。今天这一讲,我将补充 Spring 相关的典型面试问题,并谈谈其部分设计细节。
今天我要问你的问题是,谈谈 Spring Bean 的生命周期和作用域?

典型回答

Spring Bean 生命周期比较复杂,可以分为创建和销毁两个过程。
首先,创建 Bean 会经过一系列的步骤,主要包括:
实例化 Bean 对象。
设置 Bean 属性。
如果我们通过各种 Aware 接口声明了依赖关系,则会注入 Bean 对容器基础设施层面的依赖。具体包括 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,分别会注入 Bean ID、Bean Factory 或者 ApplicationContext。
调用 BeanPostProcessor 的前置初始化方法 postProcessBeforeInitialization。
如果实现了 InitializingBean 接口,则会调用 afterPropertiesSet 方法。
调用 Bean 自身定义的 init 方法。
调用 BeanPostProcessor 的后置初始化方法 postProcessAfterInitialization。
创建过程完毕。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring Bean的生命周期和作用域是本文的重点内容。文章首先介绍了Spring Bean的创建过程,包括实例化、属性设置、依赖注入、初始化方法调用等步骤,以及销毁过程中调用的方法。此外,还介绍了Spring Bean的作用域,包括Singleton和Prototype两种基础作用域,以及在Web容器中支持的Request、Session和GlobalSession作用域。作者强调了对Bean生命周期的理解和思考,以及对Spring设计和机制的体现的重要性。文章还提到了Spring框架的涵盖范围和AOP设计的细节,为读者提供了对Spring基础机制和AOP支持的一些补充。总的来说,本文通过对Spring Bean的生命周期和作用域进行详细介绍,帮助读者更好地理解Spring框架的核心概念和机制。 文章还涉及了Spring框架的广义和狭义概念,以及Spring生态系统中的Spring Boot、Spring Cloud等相关内容。此外,还探讨了Spring AOP的设计和实现细节,包括切面、Join Point、Pointcut、Advice等关键概念,以及AOP在软件工程中的作用和实现原理。通过对AOP的深入探讨,读者可以更好地理解Spring框架中AOP的运行机制和实际应用。 总的来说,本文内容丰富,涵盖了Spring框架的核心概念、生态系统和AOP设计的细节,适合想要深入了解Spring框架技术特点的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(30)

  • 最新
  • 精选
  • caoxile
    @代码狂徒 感觉本篇文章跑题了呢,关于生命周期,只讨论了初始化过程和销毁过程,那么什么时候引发的初始化呢?什么时候触发销毁操作呢?spring容器管理的bean是在容器运行过程中不会被销毁吧? 我来讲讲吧: 首先理解scope: 1. Singleton(单例) 在整个应用中,只创建bean的一个实例 2. Propotype(原型) 每次注入或者通过Spring应用上下文获取的时候,都会创建一个新 的bean实例。 3. Session(会话) 在Web应用中,为每个会话创建一个bean实例。 4. Request(请求) 在Web应用中,为每个请求创建一个bean实例。 他们是什么时候创建的: 1一个单例的bean,而且lazy-init属性为false(默认),在Application Context创建的时候构造 2一个单例的bean,lazy-init属性设置为true,那么,它在第一次需要的时候被构造. 3 其他scope的bean,都是在第一次需要使用的时候创建 他们是什么时候销毁的: 1 单例的bean始终 存在与application context中, 只有当 application 终结的时候,才会销毁 2 和其他scope相比,Spring并没有管理prototype实例完整的生命周期,在实例化,配置,组装对象交给应用后,spring不再管理.只要bean本身不持有对另一个资源(如数据库连接或会话对象)的引用,只要删除了对该对象的所有引用或对象超出范围,就会立即收集垃圾. 3 Request: 每次客户端请求都会创建一个新的bean实例,一旦这个请求结束,实例就会离开scope,被垃圾回收. 4 Session: 如果用户结束了他的会话,那么这个bean实例会被GC.

    作者回复: 谢谢反馈,每篇有3K左右的限制,有些细节就不面面俱到了,尽量让有限的内容起到抛砖引玉的作用

    2019-01-09
    5
    75
  • yao_jn
    读老师的文章收益很大,希望老师再对框架多讲一些,还有底层原理,毕竟很多时候看源码很费力,提点下会好很多!

    作者回复: 坦白说,真的要提高还是要靠自己,建议你看看别人的思路而不只是他的观点,源码就和上学读英文一样,看多了就不犯困,尽量让自己有输出

    2018-08-02
    12
  • null
    老师,IOC 为什么可以实现解耦吖? 在引入 IOC 容器之前,对象 A 依赖于对象 B,则需要 A 主动去创建对象 B,控制权都在 A。 在引入 IOC 容器之后,当对象 A 运行到需要对象 B 的时候,IOC 容器会主动创建一个对象 B 注入到对象 A,控制权在容器。 控制权发生了反转,为什么能降价系统耦合,或者说降低什么之间的耦合?(自己的理解:应该不是降低对象间的耦合,因为不管由 A 还是容器创建 B 对象,A 都是耦合 B 的。感觉自己理解的方向偏了。) 谢谢!

    作者回复: IOC容器负责打理这些事情。同样的依赖关系,一个是a自己负责,一个是ioc容器负责,相当于ab之间的直接联系,变成了间接的。再配合OO,更换实现只需要修改配置

    2018-08-02
    11
  • 汉斯·冯·拉特
    想不到博主对spring也有深入了解。声明式事务是通过beanPostProcessor来实现的,springioc会用beanPostProcessor的某个方法(具体方法名忘记了,这里假设为方法A)返回结果作为getBean的结果。所以spring的事务模块在方法A中,用代理的方式,在目标方法前后加入一些与事务有关的代码,方法A的返回值就是这个代理类。欢迎拍砖!

    作者回复: 喜欢读读源码而已,不敢说有多深入,因为实际踩坑经验不足;补充本文是因为虽然已经36篇,但是Java开发者不会只用Java se自身,开源项目必不可少

    2018-08-03
    6
  • XiaoYeGe
    第一次写留言, 看了几个月了,中间有些篇幅关于JVM的介绍,建议去看<<深入理解Java虚拟机>>这本书, 讲的不错, 当然博主总结的也好. 总之, 谢谢博主

    作者回复: 的确是经典书籍,书比专栏要更系统、全面

    2018-11-20
    4
  • 李峰
    能否分享下你看spring源码的技巧,和方法,我也读了一些其他的源码,感觉spring太全复杂度就很高,看着看着就迷失了

    作者回复: 个人的建议: 明确目的、目标,尽量让自己有个清晰的体系; 如果有实际任务驱动更好,毕竟大多数情况是随便看看,没有收获感,也就浅尝辄止了; 有输出,能表达出来,才好验证

    2018-08-20
    4
  • GL
    漏了BeanFactoryPostProcessor,在BeanPostProcessor前执行

    作者回复: 哦,我再翻翻代码看看

    2018-08-03
    3
  • 李峰
    老师,请教下,因为我也读了几次spring的源码,相比其他我读过的源码个人觉得spring复杂度很复杂,很多细节看着看着就迷失在他的代码里面了能否分享下你看spring源码的方法,感谢

    作者回复: 已回复

    2018-08-20
    1
  • 代码狂徒
    感觉本篇文章跑题了呢,关于生命周期,只讨论了初始化过程和销毁过程,那么什么时候引发的初始化呢?什么时候触发销毁操作呢?spring容器管理的bean是在容器运行过程中不会被销毁吧?
    2018-08-24
    4
    151
  • Meteor
    Spring容器初始化开始: 1.[BeanFactoryPostProcessor]接口实现类的构造器2.[BeanFactoryPostProcessor]的postProcessorBeanFactory方法 3.[BeanPostProcessor]接口实现类的构造器 4.[InstantiationAwareBeanPostProcessorAdapter]构造器 5.[InstantiationAwareBeanPostProcessorAdapter]的postProcessBeforeInstantiation方法(从这里开始初始化bean) 6.[Bean]的构造器 7.[InstantiationAwareBeanPostProcessorAdapter]的postProcessAfterInstantiation 8.[InstantiationAwareBeanPostProcessorAdapter]的postProcessPropertyValues方法 9.[Bean]属性注入,setter方 方法 10.[Bean]如果实现了各种XXXaware接口,依次调用各个setXXX(如BeanNameAware.setBeanName(),BeanFactoryAware.setBeanFactory()) 11.[BeanPostProcessor]的postProcessBeforeInitialization方法 12.[InstantiationAwareBeanPostProcessorAdapter]的postProcessBeforeInitialization方法 13.[Bean]自定义的init-method 14.[Bean]如果实现了InitializingBean接口,此时会调用它的afterPropertiesSet方法 15.[BeanPostProcessor]的postProcessAfterInitialization方法(此时bean初始化完成) 16.[InstantiationAwareBeanPostProcessorAdapter]的postProcessInitialization方法(到这里容器初始化完成) 17.业务逻辑bean的使用 Bean的销毁过程: 1.[DisposableBean]的destory方法 2.[Bean]自定义的destory-method方法 说明:如果有多个bean需要初始化,会循环执行5--15。 重要说明:欢迎拍砖,欢迎拍,欢迎,欢,……
    2018-08-05
    44
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部