1.循环依赖问题
提示:问题描述
核心问题
错误现象:在Spring Boot拦截器(Interceptor)中直接注入FeignClient时,触发循环依赖,抛出 BeanCreationException。

错误代码如下,拦截器


2 解决办法
2.1使用@Lazy注解
使用@Lazy注解
在拦截器中注入FeignClient时,添加@Lazy延迟初始化
@Lazy注解的介绍
@Lazy 是 Spring 框架中的一个注解,用于控制 Bean 的初始化时机。默认情况下,Spring 容器会在启动时一次性初始化所有被 @Component 或其衍生注解(如 @Service, @Repository, @Controller 等)标记的 Bean。而使用 @Lazy 注解后,Bean 的初始化会被延迟到第一次实际使用时才进行。
延迟加载:避免在容器启动时加载不必要的 Bean,从而减少内存占用和启动时间。
按需加载:只有当某个 Bean 被真正需要时(例如通过依赖注入或直接调用),才会被实例化。
说人话就是:只有被使用时才会被注册到Bean容器中
实例:

3 详细解释问题
1 核心问题
错误现象:启动Spring应用时,因构造器注入导致循环依赖,抛出 BeanCurrentlyInCreationException 异常。
2 依赖链:A类依赖B类,B类依赖A类,形成闭环。
触发原因:
构造器注入(Constructor Injection)无法处理循环依赖。
Spring的三级缓存机制(Singleton Factories)无法在构造器阶段完成对象预缓存,导致实例化失败。
3.解决方案
改用Setter注入
将构造器注入改为Setter注入,Spring可通过@Autowired或@Inject延迟依赖注入,从而打破循环。
示例代码:
// 原构造器注入(错误)
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;
}
}
// 修改为Setter注入(正确)
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;
}
}
调整依赖关系
重构代码,消除循环依赖(如抽取公共服务类、调整模块职责)。
使用@Lazy注解
在字段注入时添加@Lazy,延迟目标Bean的初始化:
@Autowired
@Lazy
private B b;
小结
提示:结合网上的资源的自我理解,不对的地方希望大家能给予指正

2074

被折叠的 条评论
为什么被折叠?



