Spring Bean的生命周期

214 阅读2分钟
  1. 第一步,实列化一个Bean,也就是我们常说的new

  2. 第二步,IOC依赖注入,按照Spring上下文对实列化的Bean进行配置,也就是IOC注入

  3. 第三步,setBeanName实现,如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中的Bean的id值

  4. 第四步,BeanFactoryAware实现,如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory,setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需要在spring配置文件中配置一个普通的Bean就可以)

  5. 第五步,ApplicationContextAware实现,如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入spring上下文(同样这个方式也可以实现步骤步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法)

  6. 第六步,postProcessAfterInitialization接口实现--初始化预处理,如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj,String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用内存或缓存技术。

  7. 第七步,init-method,如果Bean在Spring配置文件中配置了init-method数据会自动调用其配置的初始化方法。

  8. 第八步,postProcessAfterInitialization,如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj,String s)方法。

  9. 第九步,Destroy过期自动清理阶段,当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

  10. 第十步,destroy-method自动配置清理,最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置销毁的方法

  11. 第十一步,bean标签有两个重要的属性(init-method和destroy-method),用它们你可以自己定制初始化和注销的方法,它们也有相应的注解(@PostConstruct和@PreDestroy)。

总结:

  1. 实例化Bean
  2. 设置属性值(依赖注入)
  3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name
  4. 如果实现了BeanFactoryAware接口,调用setBeanFactory设置BeanFactory。
  5. 如果实现了ApplicationContextAware接口,调用setApplicationContext设置Application-Context。
  6. 调用BeanPostProcessor的预先初始化方法。
  7. 调用InitializingBean的afterProprocessSet()方法
  8. 调用定制init-method方法
  9. 调用BeanPostProcessor的后初始化方法。
  10. 使用我们的Bean

Spring销毁Bean的过程如下:

  1. 调用DisposableBean的destroy()
  2. 调用定制的destroy-method方法