推荐阅读:
在面试中,我们经常会被问到一个问题,就是SpringBean的生命周期。用大白话说,就是说其在创造到销毁按顺序调用了什么方法,在我刚开始学了,一般就是对着标准答案去硬背,完全不了解其意思,也十分容易忘记。
流程图如下
这样看上去十分的复杂,记住也很容易忘掉。
所以,我下面会用代码的方式一步步来模拟SpringBean的工作流程,做到深入了解,这样就不会再次忘记这个知识点了。
既然都说Bean对象Bean对象,那么SpringBean自然也是一个对象了,我们用一个简单的对象来说明,那么要创建对象就需要有构造方法,对象还会有它的属性跟get、set方法。
private String field; public SpringBean() { System.out.println("SpringBean 构造方法"); } public String getField() { System.out.println("SpringBean get方法"); return field; } public void setField(String field) { System.out.println("SpringBean set方法"); this.field = field; }
众所周知要创建一个SpringBean的话还要在配置文件里去声明这个Beam,当然也可以用注解的方式。
<bean class="SpringBean"> <property name="field" value="test" /> </bean>
然后我们去初始化这个容器看看,运行结果是什么
public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); }
这里我们可以看到当我们在容器里面加载bean的时候,它会依次调用构造方法和set方法,这两步我相信大部分人都知道。但是除此之外我们想一想,我们的Spring它是否还干了别的事情,我们接下来看一下。
如果这个Bean它实现了一些Aware接口的话,它就会注入和bean容器基础属性层面相关的信息。比如实现了BeanNameAware接口,我们要重写它的setBeanName方法,在配置文件中把这个Bean的id设置一下
public void setBeanName(String s) { System.out.println("setBeanName:" s); }
<bean id="BeanName" class="SpringBean"> <property name="field" value="test" /> </bean>
运行一下看会发生什么
剩下的BeanFactoryAware和ApplicationContextAware接口同理,我们直接看结果