spring 中 @DependsOn 真的能解决循环依赖吗?

开启依赖循环配置, 使用三级缓存就能解决这种简单的循环依赖, 也就是说解决循环真正依靠的是三级缓存机制, 为什么我还需要使用 @DependsOn 呢


@DependsOn 注解主要用于确保bean在其依赖项之后初始化


网上 @DependsOn 解决循环依赖的例子

从网上看到解决循环依赖的例子, 说是加入@DependsOn 就可以解决简单的循环依赖,

but 真的是这样吗?

@Component("A")
@DependsOn("B")
public class A {
    // ...
}
@Component("B")
@DependsOn("A")
public class B {
    // ...
}

在提供的代码示例中,使用了@DependsOn注解来显式地定义bean之间的依赖关系。实际上,这种方式没有解决循环依赖的问题。相反,这种设置可能导致Spring在处理这两个类之间的依赖关系时遇到问题。

@DependsOn注解的作用是声明一个bean在另一个bean之后初始化。在您的例子中,类A声明了在类B之后初始化,类B也声明了在类A之后初始化。这种配置在理论上会导致Spring不断地尝试初始化这两个bean,因为它们彼此依赖。

但实际上,Spring有一个内部机制(如bean创建的三级缓存)来处理这种循环依赖。Spring通过提前暴露一个尚未完全初始化的bean实例,从而解决循环依赖问题。所以在这个特定的情况下,尽管存在循环依赖,但Spring仍然可以成功地初始化bean。

需要注意的是,这种方法并不能保证在所有情况下都能解决循环依赖问题。例如,在使用构造器注入时,如果循环依赖关系无法在运行时解析,那么Spring将无法创建bean。因此,最佳实践是避免创建循环依赖关系,并考虑重新设计类和接口以解决这个问题。

@DependsOn 它真不是用来解决循环依赖的呀

实际上解决循环依赖的是Spring的三级缓存机制,而不是@DependsOn注解。@DependsOn主要用于控制bean初始化的顺序,而不是解决循环依赖问题。在某些情况下,使用@DependsOn注解可能会让代码更容易理解,因为它明确了bean之间的依赖关系。

当Spring框架遇到循环依赖时,它使用了一种名为三级缓存的机制来解决这个问题。三级缓存的主要目的是确保在处理循环依赖时,每个bean都能获得其依赖项的引用,即使这些依赖项尚未完全初始化。这是通过以下三个缓存实现的:

  1. 一级缓存(Singleton Objects):存储已经完全初始化的bean实例。当一个bean完全初始化后,它会从二、三级缓存移动到一级缓存中。

  2. 二级缓存(Early Singleton Objects):存储尚未完全初始化但已经创建的bean实例。在循环依赖的情况下,这些bean实例将被提前暴露给其他依赖它们的bean。

  3. 三级缓存(Singleton Factories):存储bean工厂对象,用于创建实际的bean实例。当一个bean需要引用尚未初始化的依赖项时,这些工厂对象可以用于提供对尚未完全初始化的bean的引用。

@DependsOn注解主要用于确保bean在其依赖项之后初始化。使用@DependsOn时,Spring会确保目标bean在声明的依赖项之后初始化。然而,它并不直接解决循环依赖问题。实际上,在您提供的示例中,如果不使用@DependsOn注解,Spring的三级缓存机制也可以解决这种简单的循环依赖。

总之,@DependsOn注解主要用于控制bean初始化的顺序,而不是解决循环依赖问题。解决循环依赖的真正原理是Spring框架的三级缓存机制。在处理循环依赖时,最佳实践是避免产生循环依赖关系,并根据需要对类和接口进行重构。

只能说让 @DependsOn 在循环依赖中起到一个标识作用了, 让循环依赖关系清晰点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值