随笔 - 72  文章 - 0  评论 - 0  阅读 - 5438

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   or追梦者  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示