第37讲 | 谈谈Spring Bean的生命周期和作用域?
该思维导图由 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-09575 - yao_jn读老师的文章收益很大,希望老师再对框架多讲一些,还有底层原理,毕竟很多时候看源码很费力,提点下会好很多!
作者回复: 坦白说,真的要提高还是要靠自己,建议你看看别人的思路而不只是他的观点,源码就和上学读英文一样,看多了就不犯困,尽量让自己有输出
2018-08-0212 - 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-0211 - 汉斯·冯·拉特想不到博主对spring也有深入了解。声明式事务是通过beanPostProcessor来实现的,springioc会用beanPostProcessor的某个方法(具体方法名忘记了,这里假设为方法A)返回结果作为getBean的结果。所以spring的事务模块在方法A中,用代理的方式,在目标方法前后加入一些与事务有关的代码,方法A的返回值就是这个代理类。欢迎拍砖!
作者回复: 喜欢读读源码而已,不敢说有多深入,因为实际踩坑经验不足;补充本文是因为虽然已经36篇,但是Java开发者不会只用Java se自身,开源项目必不可少
2018-08-036 - XiaoYeGe第一次写留言, 看了几个月了,中间有些篇幅关于JVM的介绍,建议去看<<深入理解Java虚拟机>>这本书, 讲的不错, 当然博主总结的也好. 总之, 谢谢博主
作者回复: 的确是经典书籍,书比专栏要更系统、全面
2018-11-204 - 李峰能否分享下你看spring源码的技巧,和方法,我也读了一些其他的源码,感觉spring太全复杂度就很高,看着看着就迷失了
作者回复: 个人的建议: 明确目的、目标,尽量让自己有个清晰的体系; 如果有实际任务驱动更好,毕竟大多数情况是随便看看,没有收获感,也就浅尝辄止了; 有输出,能表达出来,才好验证
2018-08-204 - GL漏了BeanFactoryPostProcessor,在BeanPostProcessor前执行
作者回复: 哦,我再翻翻代码看看
2018-08-033 - 李峰老师,请教下,因为我也读了几次spring的源码,相比其他我读过的源码个人觉得spring复杂度很复杂,很多细节看着看着就迷失在他的代码里面了能否分享下你看spring源码的方法,感谢
作者回复: 已回复
2018-08-201 - 代码狂徒感觉本篇文章跑题了呢,关于生命周期,只讨论了初始化过程和销毁过程,那么什么时候引发的初始化呢?什么时候触发销毁操作呢?spring容器管理的bean是在容器运行过程中不会被销毁吧?2018-08-244151
- MeteorSpring容器初始化开始: 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-0544