Spring必问-bean生命周期和循环依赖

chatgpt回答

Spring Bean 的生命周期可分为以下阶段:

  1. 实例化:Spring容器根据配置文件或者注解等方式创建一个 Bean 实例,它是一个普通的 Java 对象。
  2. 属性赋值:Spring 容器通过 setter 方法或者构造器为 Bean 实例的属性赋值。
  3. BeanPostProcessor 前置处理:Spring 容器调用实现了 BeanPostProcessor 接口的类的 postProcessBeforeInitialization 方法,该方法在 Bean 实例化之后、初始化之前被调用,用于对 Bean 实例进行加工处理。
  4. 初始化:Spring 容器调用 Bean 实例的初始化方法,可以在 Bean 上使用 @PostConstruct 注解或者实现 InitializingBean 接口来指定初始化方法。
  5. BeanPostProcessor 后置处理:Spring 容器调用实现了 BeanPostProcessor 接口的类的 postProcessAfterInitialization 方法,该方法在 Bean 实例化之后、初始化之后被调用,用于对 Bean 实例进行加工处理。
  6. 使用:Spring 容器将 Bean 实例注入到其他 Bean 中或者在 BeanFactory 中管理,应用程序可以通过 ApplicationContext 获取 Bean 实例。
  7. 销毁:Spring 容器调用 Bean 实例的销毁方法,可以在 Bean 上使用 @PreDestroy 注解或者实现 DisposableBean 接口来指定销毁方法。

Spring 通过三级缓存解决循环依赖问题。当创建 Bean 实例时,Spring 会检查当前创建的 Bean 是否有依赖其他 Bean,如果有依赖,则会尝试从缓存中获取依赖的 Bean,如果缓存中没有,则会创建依赖的 Bean。

如果依赖的 Bean 也依赖当前 Bean,就会产生循环依赖。为了解决这个问题,Spring 采用了三级缓存:

  1. singletonObjects:缓存已经创建好的单例 Bean 实例。
  2. earlySingletonObjects:缓存正在创建中的 Bean 实例,还未进行属性注入。
  3. singletonFactories:缓存 Bean 工厂对象,用于解决循环依赖。

当 Spring 创建 Bean 实例时,会先将正在创建的 Bean 实例放入 earlySingletonObjects 缓存中,然后再创建依赖的 Bean 实例,如果依赖的 Bean 也依赖当前 Bean,就会从 singletonFactories 缓存中获取 Bean 工厂对象,通过工厂方法创建一个代理对象,再进行属性注入和初始化。

最后,再将创建好的 Bean 实例放入 singletonObjects 缓存中,并从 earlySingletonObjects 缓存中移除。这样就能够解决循环依赖问题。

#你觉得今年春招回暖了吗#
全部评论
感谢大佬分享
1 回复 分享
发布于 2023-03-16 19:03 四川
Bean 的实例化通常由容器负责,在容器启动时,根据配置文件或注解信息,容器会创建一个或多个 Bean 实例。 实例化 Bean 的过程通常可以分为以下两种方式: 使用构造方法实例化:容器根据配置文件或注解信息,调用 Bean 对应的构造方法创建一个新的实例。这个过程通常涉及到依赖注入和参数解析等操作,以确保实例被正确地创建和初始化。 使用工厂方法实例化:容器根据配置文件或注解信息,调用 Bean 工厂中的工厂方法创建一个新的实例。这个过程通常涉及到依赖注入、参数解析和一些额外的初始化操作,以确保实例被正确地创建和初始化。 在 Spring 框架中,Bean 的实例化过程通常由 BeanFactory 和 ApplicationContext 接口负责管理和控制,它们提供了各种方法和回调函数用于实现 Bean 的实例化。例如,BeanFactory 提供了 getBean() 方法,用于从容器中获取指定名称的 Bean 实例;ApplicationContext 则提供了更多的方法和事件类型,用于处理更加复杂的实例化需求。
点赞 回复 分享
发布于 2023-03-17 13:46 日本
简单概括: 实例化:配置⽂件找定义,利用反射建实例。 属性赋值:有值则用set()设置,再看有无Awar,如有则调相关set()。 初始化: 如果有以下配置,则将执行对应method。 若载BeanPostProcessor(),执⾏ postProcessBeforeInitialization() 。 如有实现InitializingBean ,行 afterPropertiesSet() 配置⽂件有定义,相关 init-method 属性的,则将执⾏指定⽅法。 如有加载BeanPostProcessor 对象,执⾏ postProcessAfterInitialization() ⽅法 ————这里就可以使用这个bean了———— 销毁: 如果实现DisposableBean 接⼝,执⾏ destroy() ⽅法。 配置⽂件有定义,相关 destroy-method 属性的,执⾏指定的⽅法。 作者:朝书暮省 链接:https://www.jianshu.com/p/fd8dc1e0d30e 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
点赞 回复 分享
发布于 2023-03-17 13:45 日本
马了学习一下
点赞 回复 分享
发布于 2023-03-16 18:18 山东

相关推荐

08-17 22:19
得物app_HR
电商运营面经🔴一面(电话面)5.201.确认基本信息2.进行简单的自我介绍3.询问为什么想来这个岗位(我从想去得物以及想去电商运营这个岗位回答de)4.确认到岗时间&二面时间🔴二面(飞书线上面试)5.211.自我介绍(我从活动运营+数据分析两个板块对应我的简历进行自我介绍的)2.你知道电商运营一共有哪些类型吗3.得物电商和传统电商的差异4. 对dw电商了解5.了解小众潮奢衣服嘛6.前面一段实习主要处理哪些数据问题7.对vlookup函数掌握的怎么样8.介绍业务线+询问到岗时间🔴反问:希望在我入职之前掌握哪些技能~得物26届校招正式开启!【为热爱,全力以赴】1、招聘对象:26届毕业生2、九大职类:技术类、运营类、供应链类、设计类、商品研究类、职能类、风控类、产品类、数据分析类;3、七大城市:上海&杭州&北京&廊坊&广州&沈阳&长沙;4、投递方式内推链接:https://poizon.jobs.feishu.cn/s/Os0tRXi4y4E内推码:NN4H2JC🎯【内推优势】绿色通道:简历优先筛选,让你脱颖而出,后续有疑问或流程问题欢迎随时联系,推荐方式选择校园大使推荐【内推优势】绿色通道:简历优先筛选,让你脱颖而出5、招聘流程网申&内推——笔试/测评——面试——OFFER——签约大家投递完可以在评论区打上姓名缩写+岗位(比如PM+LJJ),我私你们面经~~
得物求职进展汇总
点赞 评论 收藏
分享
评论
2
82
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务