首页 > 其他分享 >Spring循环依赖

Spring循环依赖

时间:2023-12-15 23:22:24浏览次数:32  
标签:依赖 Spring System public 循环 Student println Teacher out

Java中的循环依赖分两种:

构造器的循环依赖:就是在构造器中有属性循环依赖,如下所示的两个类就属于构造器循环依赖

@Service
public class Student {

    @Autowired
    private Teacher teacher;

    public Student (Teacher teacher) {
        System.out.println("Student init1:" + teacher);
    }

    public void learn () {
        System.out.println("Student learn");
    }
}

@Service
public class Teacher {

    @Autowired
    private Student student;

    public Teacher (Student student) {
        System.out.println("Teacher init1:" + student);

    }

    public void teach () {
        System.out.println("teach:");
        student.learn();
    }
}

这两个类都是定义了一个有参构造方法,所以Spring实例化的时候只能选取该构造方法了,这就意味着实例化的时候会尝试进行依赖注入。

这种循环依赖没有什么解决办法,因为JVM虚拟机在对类进行实例化的时候,需先实例化构造器的参数,而由于循环引用这个参数无法提前实例化,故只能抛出错误。

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException....

属性的循环依赖:就是A对象依赖了B对象,B对象依赖了A对象。

@Service
public class Teacher {

    @Autowired
    private Student student;

    public Teacher () {
        System.out.println("Teacher init1:" + student);

    }

    public void teach () {
        System.out.println("teach:");
        student.learn();
    }

}

@Service
public class Student {

    @Autowired
    private Teacher teacher;

    public Student () {
        System.out.println("Student init:" + teacher);
    }

    public void learn () {
        System.out.println("Student learn");
    }
}

两个类都只有默认的无参构造,所以实例化的时候不会主动进行依赖注入,只能按照@Autowired注解去注入属性了。 @Autowired注解注入也就相当于是setter注入了,这是即使发生了循环依赖,Spring也是可以解决的。

标签:依赖,Spring,System,public,循环,Student,println,Teacher,out
From: https://www.cnblogs.com/nxjblog/p/17904358.html

相关文章

  • 基于SpringBoot的网上租赁系统-计算机毕业设计源码+LW文档
    摘要本课题是根据用户的需要以及网络的优势建立的一个基于SpringBoot的网上租贸系统,来满足用户网络商品租赁的需求。本网上租贸系统应用Java技术,MYSQL数据库存储数据,基于SpringBoot框架开发。在网站的整个开发过程中,首先对系统进行了需求分析,设计出系统的主要功能模块,其次对网......
  • 消息队列和事件循环
    每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理DOM,又要计算样式,还要处理布局,同时还需要处理JavaScript任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环系统。但并不......
  • SpringBoot使用Async注解实现异步线程
    1、启动类增加@EnableAsync注解2、yml增加配置spring:task:execution:pool:max-size:8core-size:8keep-alive:60queue-capacity:1000thread-name-prefix:Asnyc-task-calc-3、编写配置类AsyncTaskConfigimp......
  • spring boot启动耗时分析-spring-startup-analyzer使用
    github地址:https://github.com/linyimin0812/spring-startup-analyzer1、安装curl-sShttps://raw.githubusercontent.com/linyimin0812/spring-startup-analyzer/main/bin/install.sh|sh 2、maven<parent><groupId>io.github.linyimin0812</groupI......
  • Template Engines for Spring: FreeMarker | Java Server Pages | Thymeleaf | Jade4j
    Besidesthetemplateenginesdescribedsofar,therearequiteafewmoreavailablewhichmaybeused.Let’sreviewsomeofthembriefly.Velocity isanoldertemplateengine,whichisverycomplexbuthasthedisadvantagethatSpringhasdeprecateditsu......
  • SpringBoot启动
    springBoot启动全流程如下所示:框架初始化,完成相关配置:publicSpringApplication(ResourceLoaderresourceLoader,Class<?>...primarySources){this.resourceLoader=resourceLoader;Assert.notNull(primarySources,"PrimarySourcesmustnotbenull&quo......
  • springcloudalibabada搭建过程中springboot启动卡住起不来 (Started MoonceProviderApp
    如下图一样springcloudAlibaba在创建新模块之后启动新模块没有注册到nacos上,而是直接卡住起不来原因 原因是:引入了错误的web包: 解决办法:引入相应的 spring-boot-starter-web包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot......
  • Dubbo v Spring Cloud:两大技术栈如何选型?
    Java全能学习+面试指南:https://javaxiaobear.cn提到微服务开源框架,不可不说的是Dubbo和SpringCloud,这两大框架应该是大家最熟悉的微服务解决方案,也是面试中的热点。今天我们梳理下Dubbo和SpringCloud的应用特性,以及两个组件的功能对比。Dubbo应用Dubbo是阿里开源的一......
  • Nestjs 依赖注入和控制反转
    前言Nest.js是一个使用TypeScript实现的在Node.js环境中运行的Web服务开发框架。它借鉴了很多优秀的设计思想,本文来说一说Nest中的依赖注入和控制反转。依赖注入依赖注入,英文名是DependencyInjection,简称DI。什么是依赖注入?可以分开来看,就是“依赖”和“注入”。您可能......
  • 一文带你掌握Spring事务核心:TransactionDefinition详解!
    TransactionDefinition是Spring框架中用于定义事务属性的核心接口。在Spring的事务管理中,这个接口扮演着至关重要的角色,它允许开发者定制事务的各种属性,如隔离级别、传播行为、超时时间以及是否只读。基本介绍TransactionDefinition接口的主要方法:getIsolationLevel():返......