spring bean生命周期

Author Avatar
丁起男 07月 13,2020
  • 在其它设备中阅读本文章

简介

什么是spring bean:

  • 通常来说,spring beans就是被spring容器管理的java对象

什么是spring容器:

  • spring容器负责实例化,配置和装配spring beans

BeanFatory和ApplicationContext

BeanFatory接口

这是一个用来访问spring容器的root接口,要访问spring容器,我们将使用spring依赖注入功能,使用beanfatory接口和它的子接口

beanfatory是实现使用懒加载的方式,这意味着beans只有在我们通过getBean()方式直接调用它们的时候才进行实例化

特征:

  • bean的实例化/串联

ApplicationContext接口

它是spring应用程序的中央接口,用于向应用程序提供配置信息

它继承了bean fatory接口,所以applicationContext包含beanFactory的所有功能和更多功能

它主要功能是支持大型的业务应用的创建

与beanFactory懒加载的方式不同,它是预加载,所以,每一个bean都在applicationContext启动之后实例化

特性:

  • bean instantiation/wring
  • bean的实例化/串联
  • 自动的BeanPostProcessor注册
  • 自动的BeanFactoryPostProcessor注册
  • 方便的MessageSource访问(i18n)
  • applicationEvent的发布

初始化

InitializingBean

  • 我们可以通过实现InitializingBean接口,在唯一方法afterPropertiesSet内完成实例化的工作
  • 但是spring framework 官方并不建议我们通过这种方法来完成bean实例化,这是一种强耦合的方式,框架层面才会用到这个方法

PostConstruct

  • 这种方式是spring非常提倡的一种方式,我们通常将其标记在方法上即可
  • 通常将这个方法起名为init()

init-method

  • @Bean的initMethod中指定初始化方法名称
  • 和xml中bean标签的init-method属性类似

同时使用

调用顺序:

  1. @PostConstruct
  2. InitializingBean.afterPropertiesSet()
  3. init-method

BeanPostProcessor

  • 接口里有方法postProcessorBeforeInitialization和postProcessorAfterInitialization
  • 分别是在三种初始方式的前和后执行

aop在此实现

BeanFactoryPostProcessor

  • 接口里有方法postProcessBeanFactory
  • 管理bean工厂(实现FactoryBean接口)内所有的未实例化数据

spring boot在此实现

销毁

AbstractApplicationContext.registerShutdownHook()

DispasableBean

  • 实现DispasableBean接口,在其唯一方法destroy内完成bean销毁工作
  • 但是spirng framework官方并不建议我们通过这种方法来销毁bean,这是一种强耦合的方式,框架层面才会用到这个方法

@PreDestroy

  • spring非常提倡的一种方式,将其标记在方法上即可
  • 通常起名为destory()

destroy-method

  • @Bean的属性destroyMethod中指定销毁方法
  • 和xml的bean标签的destory-method属性类似

同时使用

调用顺序:

  1. @PreDestroy
  2. DisposableBean.destroy()
  3. destroy-method

bean的生命周期

  1. 调用构造器(constructor)
  2. 通过setter方法完成依赖注入,SDI(setter dependency injection)
  3. 依赖注入一旦结束,BeanNameAware.setBeanName()会被调用,它设置该bean在Bean Factory中的名称
  4. 接下来调用BeanClassLoaderAware.setBeanClassLoader(),为bean实例提供类加载器,所有类都需要通过类加载器加载到上下文
  5. 然后BeanFactoryAware.setBeanFactory()会被调用为bean实例提供其拥有的factory
  6. 初始化
  7. 随时可用的bean
  8. 销毁

Aware

简介:

sware是spring中的一个根接口,继承该接口的子接口有很多

但是该接口没有任何方法,所有可用理解成一个标记接口

作用:

在实际项目中,不可避免要用到spring容器本身提供的资源,这时要让bean主动意识到spring容器的存在,才能调用spring提供的资源,这就是spring aware

常见子接口

aware子接口描述
BeanNameAware获取容器中bean的名称
BeanFactoryAware获取当前BeanFactory,这样可用调用容器的服务
ApplicationContextAware同上,获取applicationContext
MessageSourceAware获取Message Source相关文本信息
ApplicationEventPubisherAware发布事件
ResourceLoaderAware获取资源加载器,这样获取外部资源文件