springboot相互依赖 server相互引用方式

目录
  • springboot相互依赖server相互引用
  • spring解决相互依赖的问题
    • 构造器循环依赖
    • setter循环依赖
    • field属性注入循环依赖(prototype)
    • 小结一下

springboot相互依赖 server相互引用

public class RoleService{
	@Autowired @Lazy
	private UserServer userServer;
}
public class UserService{
	@Autowired @Lazy
	private RoleService roleService;
}

spring解决相互依赖的问题

构造器循环依赖

@Service
public class A {      
public A(B b) {  }
 }
@Service
public class B {
      public C (C c) {  }
} 
@Service
public class C {
      public A (A a) {  }
}

通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖

描述:创建A类是,构造器需要B类,那将去创建B,在创建B时又发现需要A类,则又去创建C类,最终在创建C时发现又需要A,从而形成一个环,没办法创建。

原理:Spring容器将每一个正在创建的bean标识符放在一个“当前创建bean池”中,bean标识符创建过程中将一直保持在这个池中,因为如果在创建bean过程中发现自己已经在“当前创建bean池”中时,将会抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的bean将从“当前创建bean池”中清除掉。

setter循环依赖

@Service
public class A1 {      
@Autowired      
private B1 b1; } 
@Service
public class B1 {      
@Autowired      
public C1 c1;
} 
@Service
public class C1 {      
@Autowired 
public A1 a1;
 }

通过setter注入方式构成的循环依赖。

原理:对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(比如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。

field属性注入循环依赖(prototype)

@Service @Scope("prototype") public class A1 {      
@Autowired      
private B1 b1; } 
@Service @Scope("prototype")
public class B1 {      
@Autowired      
public C1 c1; } 
@Service @Scope("prototype") public class C1 {      
 @Autowired 
public A1 a1; }

报错

小结一下

Spring只能解决Setter方法注入的单例bean之间的循环依赖

ClassA依赖ClassB,ClassB又依赖ClassA,形成依赖闭环。Spring在获取ClassA的实例时,不等ClassA完成创建就将其曝光加入正在创建的bean缓存中。在解析ClassA的属性时,又发现依赖于ClassB,再次去获取

ClassB,当解析ClassB的属性时,又发现需要ClassA的属性,但此时的ClassA已经被提前曝光加入了正在创建的bean的缓存中,则无需创建新的的ClassA的实例,直接从缓存中获取即可。从而解决循环依赖问题。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springBoot server.port=-1的含义说明

    springBoot server.port=-1的含义 今天遇到这种新奇的写法,项目是可以正常启动的. 然而http的端口有范围:1-65535.-1是访问不了的 而且只要是负数,最终启动日志打印的都是 Tomcat started on port(s): -1 (http) with context path '' 那springBoot放开负一端口的含义是什么,直接到官方文档中找答案: 明确说明了,放开-1是为了:完全关闭HTTP端点,但仍创建一个WebApplicationContext

  • spring cloud将spring boot服务注册到Eureka Server上的方法

    开篇: 我们将前面的springboot整合H2内存数据库,实现单元测试与数据库无关性提供的Restful服务注册到spring cloud的Eureka Server上. 一.引入Eureka的Client </dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</ar

  • 详解Springboot Oauth2 Server搭建Oauth2认证服务

    本教程源码 https://github.com/bestaone/HiAuth 源码比较全面,教程我就只介绍关键代码了,喜欢的点个star,谢谢! 关键词 微服务认证 Oauth2 认证中心 springboot spring-cloud-starter-oauth2 集成Oauth2 Oauth2 客户端 介绍 这里我将介绍两个部分 Oauth2 server 的开发 (hi-auth-web模块) Oauth2 client 的开发 (hi-mall-web模块) 效果图 himall.g

  • 使用Springboot搭建OAuth2.0 Server的方法示例

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. OAuth 简介 OAuth 是由 Blaine Cook.Chris Messina.Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全.开放的标准. 基于 OAuth 认证授权具有以下特点: 安全.OAuth 与别的授

  • springboot相互依赖 server相互引用方式

    目录 springboot相互依赖server相互引用 spring解决相互依赖的问题 构造器循环依赖 setter循环依赖 field属性注入循环依赖(prototype) 小结一下 springboot相互依赖 server相互引用 public class RoleService{ @Autowired @Lazy private UserServer userServer; } public class UserService{ @Autowired @Lazy private Role

  • 关于springboot 配置文件中属性变量引用方式@@解析

    这种属性应用方式是 field_name=@field_value@. 两个@符号是springboot为替代${}属性占位符产生,原因是${}会被maven处理,所以应该是起不到引用变量的作用. @@方式可以引用springboot非默认配置文件(即其他配置文件)中的变量: springboot默认配置文件是 src/main/resources/application.properties 补充知识:springboot项目使用@Value注解获取配置文件中的配置信息 application

  • springboot项目之相互依赖报错问题(基于idea)

    目录 springboot相互依赖报错 解决方法 springboot项目处理循环依赖问题(circularreference) 解决方法 springboot相互依赖报错 昨天在辛劳的进行代码搬运工作的时候,发现springboot项目的一个新建模块中service层的各个注解都变成了黑色,正常情况下应该是黄色的. 我觉得可能是一些springboot的相关组件没有引入pom文件 所以我对照着原来的模块直接复制了一些依赖 就出现了一个新大陆的报错 Error:java: Annotation

  • promise处理多个相互依赖的异步请求(实例讲解)

    在项目中,经常会遇到多个相互依赖的异步请求.如有a,b,c三个ajax请求,b需要依赖a返回的数据,c又需要a和b请求返回的数据.如果采用请求嵌套请求的方式自然是不可取的.导致代码难以维护,如何请求很多.会出现很多问题. Promise就是解决多个异步请求的问题. Promise是ES6提供的一个对象,用来传递异步操作的消息. Promise有三种状态:Pending(进行中).Resolved(已完成,又称 Fulfilled)和 Rejected(已失败). 直接上代码.有a,b请求,b依赖

  • springboot配置文件属性变量引用方式${}和@@用法及区别说明

    目录 配置文件属性变量引用${}和@@用法 ${}常用于pom.xml @@方式常用于引用springboot非默认配置文件 配置文件中的“@”问题 springboot配置文件中的${…}和@…@ 起因 原因 解决 配置文件属性变量引用${}和@@用法 ${}和@@都是springboot引用属性变量的方式 具体区别与用法: ${}常用于pom.xml 和 src/main/resources/application.properties等默认配置文件的属性变量引用. 语法为:field_na

  • java调用相互依赖的dll的处理方法

    目录 一.问题描述 二.处理办法 2.1 类定义 2.2 调用 三.结语 一.问题描述 最近在做一个功能时遇到java需要调用dll,并且dll有依赖关系,之前都是单独调用一个,其实调用dll的都是模板代码,本身没有太高的难度,主要是相互依赖的还是第一次碰见,特此记录一下并分享给需要的朋友参考. 二.处理办法 其中A是dll方法的入口,A依赖B,C,D,E,F,G五个dll,先定义接口继承StdCallLibrary ,编写加载各个dll的模板代码,需要依赖的都全部加载进来,我这儿是A依赖了B,

  • 解决springboot application.properties server.port配置问题

    目录 springboot application.properties server.port配置的问题 下面就其中一个小问题做个记录 内嵌tomcat的jar包依赖包含在pom中 Spring Boot server.port配置原理 1. autoConfigure 2. embed tomcat如何使用 总结 springboot application.properties server.port配置的问题 近年来,springboot以其快速构建方便便捷,开箱即用,约定优于配置(Co

  • SpringBoot使用spring.config.import多种方式导入配置文件

    目录 简介 导入classpath下的配置文件 导入系统目录下的配置文件 导入Nacos配置中心的配置文件 总结 简介 SpringBoot从2.4.x版本开始支持了导入文件的方式来加载配置参数,与spring.config.additional-location不同的是不用提前设置而且支持导入的文件类型相对来说要丰富很多. 我们只需要在application.properties/application.yml配置文件中通过spring.config.import属性配置需要导入的文件列表即可

  • 详解SpringBoot 调用外部接口的三种方式

    目录 1.简介 2.方式一:使用原始httpClient请求 3.方式二:使用RestTemplate方法 4.方式三:使用Feign进行消费 1.简介 SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程.在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是

  • Spring循环依赖的三种方式(推荐)

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下spring是如果解决循环依赖的. 第一种:构造器参数循环依赖 Spring容器会将每一个正在创建的Bean 标识符放在一个"当前创建Bean池"中,Bean标识符在创建过程中将一直保持 在这个池中,因此如果在创建Bean过程中发现自己已经在"当前创建Bean池"里时将抛出 BeanCurrentlyInCrea

随机推荐