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。

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

很多程序员开发,很可能都没注意Bean竟然有这么多种作用域,其实实际项目一般就前面2种会涉及到,但面试官喜欢问。

Bean的生命周期

我多找几个比较好的图,大家对比着理解理解

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

好多接口好多方法啊,来我们分个类

Bean自身的方法:的init-method和destor-method方法

Bean级生命周期接口方法:包含了BeanNameAware、BeanFacotyAware、InitialiZingBean和DisposableBean 接口方法

Spring容器生命周期接口方法:有BeanPostProcessor"后处理器"

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

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源码

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

ApplicationContextAware源码

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

BeanPostProcessor源码 【before/after】

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

InitializingBean源码

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

DisposableBean源码

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧

 

 

Spring源码

面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧