Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName
java、后端开发、程序员、spring
经常被面试问到的题目之一
面试失败经历
面试官:请介绍一下Spring框架中Bean的作用域及生命周期?
程序汪汪:不知道
面试官:你工作好多年了,(嫌弃的眼神)那你可以回去等电话
Spring框架中Bean的5个作用域
singleton单例:是spring默认缺省的,全局只有一个对象。
prototype原型:每次都是新的Bean实例,有状态的Bean建议用此类型。
request:一次Http请求中,容器返回同一实例Bean,仅在当前Http Request内有效
session:一次Http Session中,容器返回同一实例Bean,仅在当前Session内有效。
global session:一个全局的Http Session中,容器返回同一个实例Bean。
![13467292-ef35d158c7391805](https://i-blog.csdnimg.cn/blog_migrate/3d7cc439220e2d2706362d90959d3aa4.jpeg)
很多程序员开发,很可能都没注意Bean竟然有这么多种作用域,其实实际项目一般就前面2种会涉及到,但面试官喜欢问。
Bean的生命周期
我多找几个比较好的图,大家对比着理解理解
![13467292-5728d78c5f900334](https://i-blog.csdnimg.cn/blog_migrate/4ae263ad65049c3e34e280e229cad820.jpeg)
好多接口好多方法啊,来我们分个类
Bean自身的方法:的init-method和destor-method方法
Bean级生命周期接口方法:包含了BeanNameAware、BeanFacotyAware、InitialiZingBean和DisposableBean 接口方法
Spring容器生命周期接口方法:有BeanPostProcessor"后处理器"
![13467292-6d05a9c10d41ed36](https://i-blog.csdnimg.cn/blog_migrate/c68f7ef9bd6b56da8865bbe8efb02576.jpeg)
bean对象实例化,默认Bean作用域singleton
Spring对bean进行依赖注入
Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName
Bean实现了BeanFacotryAware或ApplicationContentAware,Spring会调用设置工厂setBeanFatory方法并将BeanFacoty实例透传进来,或SetApplicationContext方法被调用,Spring将应用上下文引用透传到Bean里。
Bean实现了BeanPostProcessor(后处理),bean的postProcessBeforeInitialization方法会被执行
Bean实现了InitializingBean,bean的afterPropertiesSet方法 就会被调用
初始化方法init
BeanPostProcessor(后处理),执行postProcessAfterInitialization
这时Bean准备就绪,可以执行业务逻辑被服务方调用了,Bean会一直存活在应用上下文中,直到应用上下文被销毁。
Bean实现DisposableBean,spring将执行destory方法
指定销毁方法 destroy
实战开发中Bean很少都去实现上面的全部接口,一般最多init-method、destroy-method
BeanNameAware源码
BeanFactoryAware源码
![13467292-b2b5360e056c094c](https://i-blog.csdnimg.cn/blog_migrate/2e62354e2a914380de948098480bfa8e.jpeg)
ApplicationContextAware源码
![13467292-271025219ee30059](https://i-blog.csdnimg.cn/blog_migrate/608b35555b07d2a0f77aa3e44c716053.jpeg)
BeanPostProcessor源码 【before/after】
![13467292-40ea82bfc46bd770](https://i-blog.csdnimg.cn/blog_migrate/f044e1bb04c8c739be8c0674bc21cbbc.jpeg)
InitializingBean源码
![13467292-48bae384de6148ea](https://i-blog.csdnimg.cn/blog_migrate/e77d8d77e216e608902e4b46a1be1bfb.jpeg)
DisposableBean源码
![13467292-2d3c137c896972c7](https://i-blog.csdnimg.cn/blog_migrate/d2416040aba3de0ed1d546a1763e05c7.jpeg)
Spring源码
![13467292-16639c4b80d77d3c](https://i-blog.csdnimg.cn/blog_migrate/312e20c533af14902c87fc0b49872204.jpeg)
最后送波福利。现在加群即可获取Java工程化、高性能及分布式、高性能、高架构、zookeeper、性能调优、Spring、MyBatis、Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限及相关视频资料,群号:835638062 点击链接加入群聊【Java高级架构学习交流】:https://jq.qq.com/?_wv=1027&k=5S3kL3v