品牌型号:联想拯救者R7000
系统:Windows 10专业版
软件版本:Spring Boot 4.0.2
在实际开发中,很多用户在做Spring Boot开发时可能会遇到Bean之间相互依赖导致项目启动失败,或者前后端联调时被浏览器提示跨域问题。同时在面试时大概率也会被问到循环依赖和跨域的解决方案,本文将为大家介绍Spring怎么解决循环依赖,Spring Boot可以跨域吗的相关内容。
一、Spring怎么解决循环依赖
首先我们要搞清楚“为什么会有循环依赖”。在启动Spring Boot项目时,在控制台可能看到下面的日志,并且项目启动失败,这是因为有两个或多个Bean之间形成了“闭环”。可将循环依赖想象成“互相拉扯”的两个对象:A需要B才能创建好,B又需要A才能创建好,如果同时去创建,就会卡在中间。

循环依赖有多种类型,例如多级服务之间的链式循环、构造器循环依赖、属性/setter循环依赖,其中对于“单例作用域+属性注入”的循环依赖,Spring引入了“三级缓存”的概念,能解决这种类型的循环依赖,我们可以先把它理解成三个“容器”:
1)第一级缓存:单例池(已经完全创建好的Bean)
存放已经实例化、填充属性并初始化完成的单例对象,相当于“成品区”。
2)第二级缓存:早期单例对象缓存
存放“已经实例化,但还没初始化完成”的单例对象引用,可以理解为“半成品区”。
3)第三级缓存:单例工厂缓存
存放的是创建早期对象引用的工厂(ObjectFactory),主要用于处理AOP代理等场景,在真正需要的时候再生成代理对象。

二、Spring Boot可以跨域吗
我们在做前后端分离项目时,可能会遇到后端接口在Postman或浏览器直接打开时一切正常,但在前端页面中通过Ajax或Fetch请求时,就会出现跨域问题,例如下图所示,Spring Boot可以跨域吗?如果可以,又应该如何配置?

首先要搞清楚什么是“跨域问题”,简单说,当浏览器页面来自http://localhost:8080,而请求的后端接口在http://localhost:8081,因为“协议、域名或端口有任一不同”,就属于跨域。为了安全,浏览器会默认拦截这类请求,只有后端在响应头里明确告诉浏览器“我允许你访问”,浏览器才会放行。

Spring中,我们可以在Controller或方法上使用注解【@CrossOrigin】解决跨域问题。在接口不多或只对部分接口放开跨域的场景,只需要在@RestController上加上【@CrossOrigin(origins = "http://localhost:5173")】,表示允许来自某个指定前端地址的跨域访问该控制器下的所有接口。

三、总结
以上就是Spring怎么解决循环依赖,Spring Boot可以跨域吗的相关内容。本文为大家介绍了Spring中的循环依赖,以及Spring三级缓存的概念,三级缓存可以解决单例作用域+属性注入的循环依赖。对于跨域的解决办法,可以通过注解或者配置类解决,希望对你有所帮助。