前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【年后跳槽必看篇-非广告】Spring Bean的生命周期

【年后跳槽必看篇-非广告】Spring Bean的生命周期

作者头像
@派大星
发布2024-01-10 16:49:56
890
发布2024-01-10 16:49:56
举报
文章被收录于专栏:码上遇见你码上遇见你

既然聊到Spring Bean的生命周期。首先,我们要知道的是Java Bean和Spring Bean实例化过程是有一些区别的。

Java Bean创建的步骤

简要的说一下普通环境下创建Java Bean简要的几个步骤:

  • 首先Java源码会被编译为class文件。
  • 接着类被初始化(比如new对象、反射获取对象等操作)。
  • 然后class文件会被虚拟机通过类加载器加载到JVM。
  • 最后会初始化对象供我们使用。

简单来说可以理解为Class文件作为【模板】进而创建出具体的实例。面试这么简单聊一下从而引出Spring对象的生命周期,显得你更加从容。手动狗头。哈哈


步入正题 :

Spring Bean的生命周期

而Spring所管理的Bean与Java不同的是,除了Class对象之外,还会使用BeanDefinition的实例来描述对象的信息。比如说:

  • 我们可以在Spring所管理的Bean中有一系列的描述,常见的有:@Scope、@Lazy、@DependsOn等等 。

可以理解为:Class只描述了类的信息,而BeanDefinition描述了对象的信息。也就是Spring有BeanDefinition来存储我们日常给Spring Bean定义的元数据(@Scope、@Lazy、@DependsOn)。

流程

  • 首先Spring在启动的时候需要扫描在XML/注解/JavaConfig中需要被Spring管理的Bean信息
  • 随后,会将这些信息封装成BeanDefinition,最后会把这些信息放到一个BeanDefinitionMap中
    • BeanDefinitionMap中的key是beanName,value是BeanDefinition对象
    • 到这里其实是把定义的元数据加载起来,目前真实的对象还没有进行实例化
  • 接着会遍历这个BeanDefinitionMap,执行BeanFactoryPostProcessor这个Bean工厂后置处理的逻辑
    • 比如说:我们平时定义的占位符信息,就是通过BeanFactoryPostProcessor的子类PropertyPlaceholderConfigurer进行注入进去的。
    • 当然这里我们也可以通过自定义BeanFactoryPostProcessor来对我们定义好的Bean元数据进行获取或者修改。只是我们一般不会这么做的,实际的应用场景也很少。
  • BeanFactoryPostProcessor后置处理器执行完之后,就到了实例化对象了,在Spring里边是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化。注意,这里把对象实例化,只是将对象创建出来,而对象的属性还没有注入的。
    • 比如:有一个对象UserService依赖着SendService对象,这时SendService还是null的。
  • 实例化完成后,紧接着就是把对象的相关属性给注入。
  • 属性注入完成之后,就是初始化的动作了。
  • Bean的初始化首先会判断该Bean时候实现了Aware相关的接口,如果存在了则会填充相关资源。
    • 比如:我在系统中系统通过代码程序的方式获得指定的Spring Bean。我就会抽取一个工具类,去实现ApplicationContextAware接口,来获取ApplicationContext对象从而获取Spring Bean。
  • Aware相关的接口处理完之后,就回到BeanPostProcessor后置处理器了,BeanPostProcessor后置处理器有两个方法,一个是before,一个是after。
    • 这个Bean Post Processor后置处理器是AOP实现的关键。关键子类AnnotationAwareAspectJAutoProxyCreator
    • 所以,执行完Aware相关的接口就会执行BeanPostProcessor相关子类的Before方法
  • BeanPostProcessor相关子类的before方法执行完成之后,则会执行init相关的方法。
    • 比如:@PostConstruct 、以及实现了InitizlizingBean接口、定义的init-method方法
    • 它们的执行顺序为:@PostConstruct 、实现了InitizlizingBean的接口、定义的init-method方法
    • 实际场景中@PostConstruct经常用在对象实例化后,我们要初始化爱你公关工作或者启动个线程去MQ拉取数据
  • 等到int方法执行完成之后,就会执行BeanPostProcessor的after方法。
  • 基本的重要流程就已经走完了,此后我们便可以获取对象去使用了。
  • 最后销毁的时候就看有没有配置相关的destroy方法,执行就完事了。

上述整体流程大致如图所示:

image

至此:Spring Bean的一整套生命周期也就完事了。

相信你这么吹嘘一番相比是可以hold住面试官的了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java Bean创建的步骤
  • Spring Bean的生命周期
    • 流程
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档