Spring框架

简介: 【7月更文挑战第24天】

Spring框架中的循环依赖是指两个或多个Spring Bean相互依赖对方,形成一个闭环。Spring支持两种类型的循环依赖:

  1. 构造器循环依赖:发生在Bean的构造器中,Spring容器无法处理这种循环依赖。
  2. 字段注入循环依赖:发生在Bean的字段上,Spring容器可以通过三级缓存处理这种循环依赖。

以下是构造器循环依赖和字段注入循环依赖的示例代码。

构造器循环依赖示例

假设有两个Bean AB,它们在构造器中相互依赖:

public class A {
   
    private B b;

    public A(B b) {
   
        this.b = b;
    }
}

public class B {
   
    private A a;

    public B(A a) {
   
        this.a = a;
    }
}

在Spring配置中:

@Configuration
public class AppConfig {
   
    @Bean
    public A a() {
   
        return new A(b());
    }

    @Bean
    public B b() {
   
        return new B(a());
    }
}

Spring容器在创建AB时,会尝试创建另一个,从而形成循环,这将导致BeanCurrentlyInCreationException异常。

字段注入循环依赖示例

如果AB使用字段注入而不是构造器注入,Spring可以解决循环依赖:

public class A {
   
    private B b;

    @Autowired
    public void setB(B b) {
   
        this.b = b;
    }
}

public class B {
   
    private A a;

    @Autowired
    public void setA(A a) {
   
        this.a = a;
    }
}

在Spring配置中,无需特别配置,Spring会自动处理字段注入的循环依赖:

@Configuration
public class AppConfig {
   
    @Bean
    public A a() {
   
        return new A();
    }

    @Bean
    public B b() {
   
        return new B();
    }
}

在这种情况下,Spring容器会使用一个临时的Bean引用来满足AB的依赖,然后再使用B的完整实例来满足A的依赖,从而打破循环。

目录
相关文章
|
7天前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
18 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
1月前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
4天前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
20 3
|
5天前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
|
23天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
1010 12
|
21天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
21天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
1天前
|
监控 Java 开发者
BeanPostProcessor:Spring框架的灵活扩展机制
【10月更文挑战第4天】在Spring框架中,BeanPostProcessor接口是一个非常重要的扩展点,它允许开发者在Spring容器实例化、依赖注入以及初始化Bean的过程中插入自定义逻辑。
7 0
|
1天前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。