SpringBoot 配置允许循环依赖

配置Spring应用:端口、循环依赖与日志设置
该配置文件设置了服务器端口为9999,允许Spring的循环依赖,以及将特定控制器的日志级别设为debug级别。

配置文件application.properties

#配置端口
server.port=9999
# spring开启允许循环依赖
spring.main.allow-circular-references=true
#日志的级别
logging.level.cn.ton.controller.feign.DemoFeign = debug

Spring Boot中,解决循环依赖问题的方法有以下几种: ### 重构代码(推荐) - **提取公共逻辑到新Service**:将相互依赖的公共部分提取到一个新的Service中,这样可以减少原Bean之间的直接依赖,实现解耦。 - **使用接口或事件驱动模式**:通过接口或事件来间接通信,避免Bean之间的直接循环依赖。例如,一个Bean发布事件,另一个Bean监听该事件进行相应处理,而不是直接互相引用[^1]。 ### 使用`@Lazy`注解(次优方案) `@Lazy`注解可以延迟Bean的初始化,当真正需要使用该Bean时才进行创建。在存在循环依赖的Bean上使用`@Lazy`注解,能避免在创建Bean时立即依赖对方,从而解决循环依赖问题。不过,对于频繁调用的Bean使用`@Lazy`注解会增加代理开销,因此仅适用于解决无法重构的历史代码[^1][4]。 ### 允许循环依赖(临时方案) 在Spring Boot中,可以通过配置允许循环依赖。但这种方式只是临时解决方案,因为允许循环依赖会增加Bean创建时的上下文切换,长期使用可能导致内存泄漏,如未正确释放代理对象[^4]。 ### 使用Setter注入 Setter注入可以解决循环依赖问题,其核心机制是Spring的三级缓存提前暴露未完成初始化的对象引用。常规方法创建对象出现循环依赖的原因是实例化过程和初始化过程是连续的,无法被其他Bean发现,而三级缓存解决循环依赖的根本措施就是拆分Bean加载的过程,提前暴露早期实例化Bean,以便引用这个Bean的其他Bean能够顺利加载[^2][5]。 ### 使用`@PostConstruct`和`@PreDestroy` 可以使用`@PostConstruct`和`@PreDestroy`注解来控制Bean的初始化和销毁过程,在合适的时机进行依赖注入,避免循环依赖问题。 ### 使用`ObjectFactory`和`Provider` `ObjectFactory`和`Provider`可以延迟获取依赖的Bean,在需要使用时才进行获取,从而避免在创建Bean时的循环依赖问题。 示例代码(使用`@Lazy`注解解决循环依赖): ```java import org.springframework.beans.factory.annotation.Lazy; import org.springframework.stereotype.Component; @Component public class BeanA { private final BeanB beanB; public BeanA(@Lazy BeanB beanB) { this.beanB = beanB; } } @Component public class BeanB { private final BeanA beanA; public BeanB(@Lazy BeanA beanA) { this.beanA = beanA; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值