SpringBean生命周期

一般指的是 bean 在容器中创建 -初始化-销毁的过程,在这之前会先进行bean的定义
先定义,再初始化
定义:
    1. Resource定位,定位到配置XML或者注解
    2. BeanDefinition载入,将Resource定位到的bean的信息保存到Bean的定义(BeanDefinition中,此时并不会创建Bean实例
    3. BeanDefinition的注册将BeanDefinition的信息发布到Spring Ioc容器中此时仍旧没有对应的Bean实例创建
到这里,Bean就在Spring Ioc容器中被定义了,而没有初始化,也没有完成依赖注入
这里开始bean在容器中的生命周期,通过一系列的接口穿插管控bean的整个生命周期
 
构造(创建对象)
单实例:在容器启动的时候创建对象
多实例:在每次获取时创建对象
 
容器启动的时候会创建单例对象并对其初始化(非延迟加载的)
 
下面是Ioc容器对Bean 的初始化过程
org.springframework.beans.factory.BeanFactory; 中给出了整套初始化方法及标准顺序
  1. BeanNameAware's {@code setBeanName} 如果实现了,就执行该方法
  2. BeanClassLoaderAware's {@code setBeanClassLoader}
  3. BeanFactoryAware's {@code setBeanFactory}
  4. EnvironmentAware's {@code setEnvironment}
  5. EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
  6. ResourceLoaderAware's {@code setResourceLoader} (only applicable when running in an application context)
  7. ApplicationEventPublisherAware's {@code setApplicationEventPublisher} (only applicable when running in an application context)
  8. MessageSourceAware's {@code setMessageSource} (only applicable when running in an application context)
  9. ApplicationContextAware's {@code setApplicationContext} (only applicable when running in an application context)
  10. ServletContextAware's {@code setServletContext} (only applicable when running in a web application context)
一系列Awar接口:初始化前的预处理 操作
 
  1. {@code postProcessBeforeInitialization} methods of BeanPostProcessors #进行预初始化
  2. InitializingBean's {@code afterPropertiesSet} #spring提供的初始化接口,可以覆写afterPropertiesSet方法来初始化
  3. a custom init-method definition #bean中自定义的初始化
  4. {@code postProcessAfterInitialization} methods of BeanPostProcessors #初始化后的后置处理器
此时就已经可以投入使用了
 
关闭
On shutdown of a bean factory, the following lifecycle methods apply:
  1. {@code postProcessBeforeDestruction} methods of DestructionAwareBeanPostProcessors 销毁前的后置处理
  2. DisposableBean's {@code destroy} #spring提供的销毁方法,覆写该接口的destroy方法来实现
  3. a custom destroy-method definition #bean中自定义的销毁方法
单实例:容器关闭的时候销毁
多实例:容器不会管理这个bean,不会自动调用他的销毁方法
 
 

 

 

 大致过程:

加载元信息BeanDefinition

如果有多个构造方法会推断构造方法,然后利用反射实例化bean

进行属性填充,@Autowired 先bytype, @Resource 先byName

回调Aware接口的相关方法,如果有实现
BeanPsotProcessor 进行前置处理

自定义init-method

BeanPostProcessor进行后置处理, AOP动态代理的创建

bean是单例的会放入单例池

可以使用了

容器关闭时调用destory方法销毁

 

 

 

spring Ioc在执行了初始化和依赖注入后会执行一些步骤来完成初始化,我们能根据这来设置自定义初始化和销毁。
实现了相关接口才会在生命周期中调用它的方法
spring Ioc容器正常关闭时会调用一些步骤来关闭容器,释放资源。
spring Ioc容器的最低要求是实现BeanFactory接口,而非ApplicationContext接口,如果采用了非ApplicationContext子类创建Ioc容器,那么即使覆写了相应接口,也不会在生命周期中被调用。
当服务器正常关闭,或者遇到其他关闭spring Ioc容器的时间,它就会调用对应的方法完成Bean的销毁,步骤如下:
  • 如果bean实现了接口DisposableBean的destroy方法,那么就会调用它
  • 如果定义了自定义销毁方法,那么就会调用它
  • 如果两者都有,先执行实现的DisposableBean的destroy,再执行自定义的销毁方法
初始化和销毁方法,可以通过
  • xml的init-method 和 destroy-method指定
  • 注解@Bean来指定

 

  • JSR250 javax.annotation的注解@postCunstruct和@preDestroy
BeanPostProcessor接口针对的是所有的Bean,不需要每一个bean都来实现它,用一个Bean实现该接口,在Spring Ioc容器中定义它,就能对所有的Bean产生影响。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

posted on 2023-03-12 17:17  or追梦者  阅读(2)  评论(0编辑  收藏  举报