Spring的Bean的生命周期

[toc]

前言

Spring可以管理singleton(单例)作用域的Bean的生命周期,prototype作用域的Bean,Spring只负责创建,当容器创建交给客户端代码管理,容器不在跟踪其生命周期,每次客户端请求prototype作用域的Bean,Spring都会产生一个新的实例。

对于Singleton作用域的Bean,每次请求都会返回同一个共享实例,客户端代码不能控制Bean的销毁,Spring容器负责跟踪Bean的产生、销毁,Spring容器可以创建Bean之后进行某些资源申请,还可以在销毁Bean实例之前,先回收某些资源。

生命周期

Spring的Bean的生命周期:

  • 第一步:创建实例
  • 第二步:出入属性
  • 第三步:如果实现了BeanNameAware接口,就调用setBeanName方法
  • 第四步:如果实现了ApplicationContextAware方法,则调用setApplicationContext方法
  • 实现了各种****Aware接口,调用对应方法
  • 第五步:调用BeanPostProcessor中的postProcessBeforeInitialization方法
  • 第六步:调用使用@PostConstruct
  • 第七步:如果实现了InitializingBean接口则调用afterPropertiesSet方法进行Bean的初始化
  • 第八步:调用Bean设置init方法,init-method
  • 第九步:调用BeanPostProcessor的postProcessAfterinitialization方法
  • 第十步:调用@PreDestroy注解方法调用
  • 第十一步:如果实现了DisposableBean接口,调用destroy方法
  • 第十二步:调用Bean设置的destroy方法destroy-method

注:

  • BeanPostProcessor是Spring Bean的后处理器,是一种特殊的Bean,这种特殊的Bean不对外提供服务,甚至不需要id属性,他主要负责对容器其他Bean执行后处理,例如容器中目标Bean生成代理等,这种Bean被称为Bean的后处理。
  • 初始化:InitalizingBean提供的afterPropertiesSet与init-method功能一样,对于实现了InitializingBean接口的Bean无需使用init-method属性来指定初始化方法,如果既采用了init-method属性指定初始化方法,又实现了InitializingBean接口来指定初始化方法,Spring容器会执行两个初始化方法,先执行initializingBean接口中定义的方法,然后执行init-method属性指定的方法(推荐使用init-method,因为无需代码入侵)
  • 销毁:DisposableBean提供了destroy方法与destroy-method功能一样,对于实现了DisposableBean接口的Bean无需使用destroy-method属性来指定初始化方法,如果两者同时采用,Spring容器会执行两个方法,先执行DisposableBean接口中定义的方法,然后执行destroy-method属性指定的方法(推荐使用destroy-method,因为无需代码入侵)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。