Java面试技巧之每天一个Tip——SpringBean生命周期和作用域?

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生命周期说清楚的精简版了,这个面试题不会扩展太多的,放心吧~

Java面试技巧之每天一个Tip——SpringBean生命周期和作用域?_第1张图片

接着,再来说说Spring Bean的作用域。

其实,这个问题往往是通过问Spring Bean是单例的吗?——来切入的。

SpringBean是单例的吗?当然了。

Spring Bean默认是单例的,所以也是线程并发不安全的——那么如何保证线程安全呢?——这是一个非常重要的扩展问题。

直接的回答:将bean的作用域变为原型模式(prototype)。

扩展的回答:线程隔离类——ThreadLocal。

答到以上,基本问题可以解决了,面试官至少知道你「懂」了~

追问清单:

1、ThreadLocal是如何保证Spring Bean的线程安全的。

2、SpringBean的作用域都有哪些?各自的作用是什么?

3、为什么SpringBean不是线程安全的?(需要回答在什么样的情况下,并发会出现问题?)

你可能感兴趣的:(Java,java,面试,开发语言,spring)