`

Spring Bean 生命周期 + 循环依赖解决方法

阅读更多

Bean 创建过程


 

自定义的初始化方法

通常通过 @Bean 注解的 initMethod 指定(不推荐XML形式的配置方式)。

 

Bean 销毁过程


 

自定义的销毁方法

类似自定义的初始化方法。
通常通过 @Bean 注解的 destoryMethod 指定(不推荐XML形式的配置方式)。

 

Bean循环依赖解决方法



 

通过构造方法注入依赖 —— 失败

@Service
public class FooServiceImpl implements FooService {
  private BarService barService;

  public FooServiceImpl(BarService barService) {
    this.barService = barService;
  }
  ...
}

@Service
public class BarServiceImpl implements BarService {
  private FooService fooService;

  public BarServiceImpl(FooService fooService) {
    this.fooService = fooService;
  }
  ...
}

 

这种形式下,程序启动时,Spring 会检测到“无法解决”的循环依赖:

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  barServiceImpl defined in file [.../BarServiceImpl.class]
↑     ↓
|  fooServiceImpl defined in file [.../FooServiceImpl.class]
└─────┘

 

解决方法:通属性方法注入依赖

Spring 会先创建Bean实例 FooServiceImpl 和 BarServiceImpl,再调用属性方法注入相互依赖。
虽然字段注入的方式也能解决相互依赖,但是字段注入对测试不友好,不是非常推荐。

@Service
public class FooServiceImpl implements FooService {
  private BarService barService;

  @Autowired
  public void setBarService(BarService barService) {
    this.barService = barService;
  }
  ...
}

@Service
public class BarServiceImpl implements BarService {
  private FooService fooService;

  @Autowired
  public void setFooService(FooService fooService) {
    this.fooService = fooService;
  }
  ...
}

 

  • 大小: 59 KB
  • 大小: 18.3 KB
  • 大小: 55.8 KB
分享到:
评论

相关推荐

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    本文主要研究 Spring 框架中 Bean 的实例化过程,包括 Bean 的生命周期和循环依赖问题的解决方案。在 Spring 框架中,Bean 的实例化是通过 BeanFactory 中的 getBean 方法来实现的,该方法根据 bean 的名字、Class ...

    spring bean的循环依赖完全掌握.pdf

    为了彻底掌握 Spring Bean 的循环依赖,我们需要搞清楚四个问题:普通 Bean 的非循环依赖 Bean 生命周期的流程、AOP 代理 Bean 的非循环依赖 Bean 生命周期的流程、普通 Bean 的循环依赖 Bean 生命周期的流程和 AOP ...

    Spring5.0源码深度解析之SpringBean循环依赖问题解决方案.docx

    Spring5.0源码深度解析之SpringBean循环依赖问题解决方案 ...解决SpringBean循环依赖问题需要考虑到Bean对象的生命周期和IOC容器的生命周期,使用三级缓存机制和手动设置依赖关系等方法可以解决循环依赖问题。

    Spring Bean重复执行两次(实例被构造两次)问题分析

    解决这个问题的关键在于深入理解Spring的Bean生命周期和配置机制,检查配置文件、注解使用、依赖关系等,确保每个Bean的定义都是唯一的,且作用域设置正确。同时,对源码进行调试也是一个有效的排查手段,可以追踪到...

    Spring 解决循环依赖的 3 种方式.docx

    对于非单例(prototype)Bean的循环依赖,Spring默认不会处理,因为这些Bean的生命周期较短,通常不期望有循环依赖。但如果开发者明确指定允许循环依赖,Spring会在每次请求prototype Bean时进行实例化和依赖注入,...

    详解Spring-bean的循环依赖以及解决方式

    Spring Bean 循环依赖详解及解决方案 在 Spring 框架中,Bean 的循环依赖是指两个或多个 Bean 之间的相互依赖关系,形成闭环。这种情况可能会导致 Bean 创建失败或出错。下面详细介绍 Spring Bean 的循环依赖及解决...

    基于spring+springMvc+mybatis 开发的企业门户网站

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能,例如:I0C、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 能学到什么:①工厂模式、策略模式、观察者模式等都是...

    Spring实例化Bean顺序

    首先,我们要知道Spring IoC容器是通过XML配置文件、注解或Java配置类来管理Bean的生命周期。Bean的实例化顺序取决于以下因素: 1. **定义顺序**:在XML配置中,如果Bean的定义顺序明确,那么按照它们在文件中的...

    Spring如何解决循环依赖的问题

    然而,对于非单例模式(如prototype)的bean,Spring不支持循环依赖,因为它们可能会在生命周期中被多次实例化,这会引入线程安全问题。为了防止多线程环境下同时创建多个prototype bean,Spring使用`ThreadLocal`...

    spring的bean加载顺序样例项目

    如果存在循环依赖,Spring会采用提前暴露的草案实例(Eager Initialization)来解决。 - **初始化方法**:Spring会调用Bean定义中的初始化方法,如`init-method`属性指定的方法或带有`@PostConstruct`注解的方法。 ...

    Spring简单仿写,实现基本IOC,依赖注入和AOP 未解决循环依赖

    你需要模拟Spring容器的行为,管理bean的生命周期,处理依赖注入,并且确保在遇到循环依赖时能够优雅地处理。这涉及到对Java反射机制的理解,以及如何通过设计模式来解耦代码。 在压缩包文件"spring-Imitation"中,...

    第二十章 Spring 应用上下文生命周期(ApplicationContext Lifecycle)1

    在Spring框架中,ApplicationContext是应用的核心,它管理着所有Bean的生命周期。本章将深入探讨Spring应用上下文的生命周期,从启动准备阶段到关闭阶段,包括各个关键步骤和相关组件的作用。 1. **Spring 应用上...

    SpringIOC DI循环依赖实例详解

    通过这三个容器,SpringIOC 可以正确地管理 Bean 的生命周期,避免循环依赖问题的出现。 SpringIOC DI 循环依赖实例详解展示了 SpringIOC 中的循环依赖机制,展示了 DefaultSingletonBeanRegistry 的五个容器的作用...

    简单了解spring bean的循环引用

    8. **使用`@Scope("prototype")`**:将某个Bean的生命周期改为Prototype,这样每次请求都会创建一个新的实例,避免了单例Bean间的循环引用。 以上策略可以根据实际项目需求和Bean的依赖关系来选择合适的方法。在...

    Spring IOC原理补充说明(循环依赖、Bean作用域等)

    2. **属性注入(setter方法)的循环依赖**:Spring可以在Bean实例化后,但在属性填充前检测并解决。Spring通过提前暴露一个“半成品”Bean(即只实例化但未注入属性的对象)来打破循环依赖。当检测到循环依赖时,会...

    Spring+Spring MVC+MyBatis项目demo

    1. **依赖注入**:Spring通过XML配置或注解方式管理Bean的生命周期和依赖关系,使得代码更加松耦合,易于测试和维护。 2. **AOP**:Spring的AOP模块允许我们定义切面,实现如日志记录、事务管理等跨切面关注点。 3. ...

    spring+springmvc+hibernate+thymeleaf 练习demo项目源码

    - **依赖注入**:Spring框架的核心特性,通过容器管理对象的生命周期和依赖关系,减少代码间的耦合。 - **AOP**:允许开发者定义横切关注点,如日志记录、事务管理,提高代码复用性。 - **Bean管理**:Spring容器...

    基于spring+springMvc+mybatis 开发的博客样例

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能,例如:I0C、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 能学到什么:①工厂模式、策略模式、观察者模式等都是...

    针对大厂面试,模仿Spring写的简易版IOC小框架,完美解释三级缓存解决属性注入循环依赖的问题

    学习这个项目,你需要理解每个bean的生命周期,以及如何通过容器的注册、依赖解析、预实例化和初始化等步骤来避免循环依赖。同时,这个项目也会帮助你深入理解Spring框架内部的工作原理,包括bean的装配、依赖注入、...

    画图带你彻底弄懂三级缓存和循环依赖的问题.doc

    **singletonObjects**:这是第一级缓存,存储的是已经完全初始化完毕,所有依赖注入和生命周期方法都处理完成的 Bean。这些 Bean 完全准备就绪,可供应用程序使用。\n\n2. **earlySingletonObjects**:第二级缓存,...

Global site tag (gtag.js) - Google Analytics