Spring Bean是个「古老的」问题,似乎面试中已经不常见了。
但是,偶尔,面试者还是会遭遇到这个问题,以至于被打了个措手不及,一脸懵。
为了防止出现类似的情况,Tip一下大家,很简单的Tip,不用多深刻,毕竟面试官也会理解,这其实就是一个「甜点」问题。
答出来了,证明你的基本功还扎实,答不出来,显得有点low而已~
Spring Bean的生命周期:
1、实例化——给bean对象分配内存空间——createBeanInstance()方法。
答出来上面这句话,我觉得就可以了。再深刻点,就可以分开BeanFactory和ApplicationContext两个容器了,前者是通过create方法,后者是通过BeanDefinition对象实例化。
2、初始化——属性赋值——设置对象属性(依赖注入)。
这句话可以说基本正确了,其实属性赋值还有一个部分,就是对引用的容器级别对象的属性赋值。
举例:如果实现了Aware接口(比如,BeanFactoryAware接口),那么就会调用setBeanFactory()方法,注入BeanFactory对象。
3、初始化——增强实现——前置处理方法、初始化调用方法、后置处理方法——BeanPostProcessor
大名鼎鼎的AOP,就是发生在后置处理方法的调用阶段~
4、销毁——使用完销毁——实现DisposableBean接口,调用destroy()方法,或者在配置文件中配置destroy-method属性,自动销毁。
OK,上面就是把Spring Bean生命周期说清楚的精简版了,这个面试题不会扩展太多的,放心吧~
接着,再来说说Spring Bean的作用域。
其实,这个问题往往是通过问Spring Bean是单例的吗?——来切入的。
SpringBean是单例的吗?当然了。
Spring Bean默认是单例的,所以也是线程并发不安全的——那么如何保证线程安全呢?——这是一个非常重要的扩展问题。
直接的回答:将bean的作用域变为原型模式(prototype)。
扩展的回答:线程隔离类——ThreadLocal。
答到以上,基本问题可以解决了,面试官至少知道你「懂」了~
追问清单:
1、ThreadLocal是如何保证Spring Bean的线程安全的。
2、SpringBean的作用域都有哪些?各自的作用是什么?
3、为什么SpringBean不是线程安全的?(需要回答在什么样的情况下,并发会出现问题?)