首页 > 其他分享 >@Lazy注解解决循环依赖

@Lazy注解解决循环依赖

时间:2024-11-13 20:58:06浏览次数:1  
标签:Lazy 依赖 ClassB ClassA bean 注解 LazyBean public

@Lazy 是Spring框架中的一个注解,用于延迟一个bean的初始化,直到它第一次被使用。

在默认情况下,Spring容器会在启动时创建并初始化所有的单例bean。这意味着,即使某个bean直到很晚才被使用,或者可能根本不被使用,它也会在应用启动时被创建。@Lazy 注解就是用来改变这种行为的。

也就是说,当我们使用 @Lazy 注解时,Spring容器会在需要该bean的时候才创建它,而不是在启动时。这意味着如果两个bean互相依赖,可以通过延迟其中一个bean的初始化来打破依赖循环。

假设我们有两个类 ClassA 和 ClassB,它们之间存在循环依赖。我们可以使用 @Lazy 来解决这个问题:

@Component
public class ClassA {
    private final ClassB classB;
    @Autowired
    public ClassA(@Lazy ClassB classB) {
        this.classB = classB;
    }
    // ...
}
@Component
public class ClassB {
    private final ClassA classA;
    @Autowired
    public ClassB(ClassA classA) {
        this.classA = classA;
    }
    // ...
}

在这个例子中,ClassA 的构造器依赖 ClassB,但我们使用了 @Lazy 注解来标记这个依赖。这意味着 ClassB 的实例会在首次被实际使用时才创建,而不是在创建 ClassA 的实例时。这样,Spring容器可以先创建 ClassA 的实例(此时不需要立即创建 ClassB),然后创建 ClassB 的实例,最后解决 ClassA 对 ClassB 的依赖。

但是,还是忍不住提一句:过度使用 @Lazy 可能会导致应用程序的行为难以预测和跟踪,特别是在涉及多个依赖和复杂业务逻辑的情况下。

而且,循环依赖本身通常被认为是设计上的问题。所以应该尽量从根源处避免它。

@Lazy 可以用在bean的定义上或者注入时。以下是一些使用示例:

@Component
@Lazy
public class LazyBean {
    // ...
}

在这种情况下,LazyBean 只有在首次被使用时才会被创建和初始化。

@Component
public class SomeClass {
    private final LazyBean lazyBean;
    @Autowired
    public SomeClass(@Lazy LazyBean lazyBean) {
        this.lazyBean = lazyBean;
    }
}

在这里,即使SomeClass在容器启动时被创建,LazyBean也只会在SomeClass实际使用LazyBean时才被初始化。

标签:Lazy,依赖,ClassB,ClassA,bean,注解,LazyBean,public
From: https://www.cnblogs.com/leepandar/p/18544805

相关文章

  • 《深度解析 C++中的弱引用(weak reference):打破循环依赖的利器》
    在C++编程的世界里,内存管理一直是一个关键且复杂的话题。而弱引用(weakreference)的出现,为我们处理一些特殊的内存相关问题提供了一种巧妙的方法。今天,我们就来深入了解一下什么是弱引用。一、从引用的基本概念说起我们都知道,在C++中,引用是一种给变量起别名的方式。正常......
  • Flink 开发工程应加载哪些依赖
    在我们要开发Flink程序时,就会涉及到应该加载哪些Flinkjar的问题。本章内容就是向你展示如何配置你的项目,添加必要的依赖。每个应用程序都会依赖一些Flink libraries,比如至少依赖FlinkAPIs库,如果使用了connector,则还需要依赖connector相关的库,比如kafka、jdbc等,和你自己程......
  • 【Java】自定义注解的使用
    什么是注解java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired、@Override等都是自定义注解。在JAVA中如何实现自定义注解?@interface关键字我们想定义一个自己的注解需要使用@interface来定义。//元注解@Target(ElementType.ME......
  • springboot起步依赖原理
    起步依赖原理分析1)spring-boot-starter-parent找到spring-boot-starter-parent并进入可以看到spring-boot-dependencies依赖关系再次进入通过properties来定义了各种技术的版本信息版本锁定指我们在父工程中定义好的一些坐标和他需要的版本信息,后续如果继承这个工程的话......
  • 使用 roslyn 的 Source Generator 自动完成依赖收集和注册
    在使用Hosting构建WPF程序提到,因为不使用Stylet默认的IOC容器,所以不能自动收集和注册View/ViewModel,需要动手处理。如果项目比较大,手动处理显然过于麻烦。这里使用roslyn的SourceGenerator自动完成依赖收集和注册。源码JasonGrass/WpfAppTemplate1:WPF+Styl......
  • 管理 Python 环境和依赖关系的工具 venv、virtualenv、pipenv 、poetry 、 miniforge
    管理Python环境和依赖关系的工具venv、virtualenv、pipenv、poetry、miniforge和anaconda的区别venv、virtualenv、pipenv、Poetry、Miniforge和Anaconda都是用于管理Python环境和依赖关系的工具,但它们在功能和使用场景上有一些显著的区别。以下是它们的主要区别:v......
  • PG 修改表结构提示有试图依赖的处理方法
     ALTERTABLEvictimALTERCOLUMNvictim_belong_urlTYPEvarchar(1000)USINGvictim_belong_url::varchar(1000); 修改字段长度通过修改pg_attribute基表的方式来绕开这个限制  #通过表名查出attrelidSELECTrelname,attname,attnum,attrelid,attnameFR......
  • 未能加载文件或程序集“Microsoft.Xaml.Behaviors”或它的某一个依赖项
    autocadwpfcommunitytoolkit.mvvmcombobox选定项变化事件安装Microsoft.Xaml.Behaviors.Wpf包使用命名空间xmlns:i="http://schemas.microsoft.com/xaml/behaviors"那么comobox应该是<ComboBoxItemsSource="{BindingItems}"><i:Interaction.Trigger......
  • 深入理解JUnit注解:从入门到最佳实践
    深入理解JUnit注解:从入门到最佳实践一、JUnit注解基础概览1.五大核心注解JUnit提供了五个最基本也是最常用的注解:@Test@Before@After@BeforeClass@AfterClass让我们通过一个完整的示例来了解这些注解:publicclassBankAccountTest{privatestaticDatabaseConn......
  • Web缓存中毒(Web Cache Poisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的
    Web缓存中毒(WebCachePoisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的缓存内容,使得用户在访问网站时,获得恶意内容或错误内容的攻击方式。这种攻击通常依赖于利用Web缓存的设计缺陷或未充分验证的请求参数,从而让缓存服务器存储并返回恶意的、篡改过的响应。工作原理......