避免循环依赖

本文详细介绍了在两个项目中如何避免循环依赖的问题,通过解耦代码结构,使用接口隔离原则,实现跨项目的正常引用,避免了相互调用导致的StackOverflow异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在2个项目中相互引用工程会提示 将导致循环依赖,如果相互引用的dll可以暂时规避,但日后改成引用工程则会仍报错,解决办法如下:
using System;

namespace ConsoleAppPreventCircularDependency
{
class Program
{
static void Main(string[] args)
{
//A a = new A();
//a.MethodA();
////System.StackOverflowException

AA aa=new AA();
aa.MethodAA();
}
}

/*
* 双向耦合在同一个项目下,只是设计问题;
* 在不同项目中,必须解耦,否则项目之间互相引用会提示 将导致循环依赖项
*
* 一般来说,不应该存在双向耦合,有此情况则应考虑重构
*/

#region 解耦前的代码

class A
{
private B b;

public void MethodA()
{
Console.WriteLine("MethodA 已调用!");
b = new B();
b.MethodB();//“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
}
}

class B
{
private A a;

public void MethodB()
{
Console.WriteLine("MethodB 已调用!");
//请在循环调用的某个地方,添加相关中止语句,否则会报错 栈溢出
a = new A();
a.MethodA();
}
}

#endregion

#region 解耦后的代码

/*
* AA,BB分别在2个不同的项目中,提炼一个接口,放置在一个新起的项目中,
* 然后AA,BB所在的项目引用该接口所在的项目。
*/

interface ISample
{
void MethodAA();
}

class AA : ISample
{
private BB bb;
public void MethodAA()
{
Console.WriteLine("MethodAA 已调用!");
bb = new BB();
bb.MethodBB();//“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
}
}

class BB
{
private ISample aa;

public void MethodBB()
{
Console.WriteLine("MethodBB 已调用!");
//请在循环调用的某个地方,添加相关中止语句,否则会报错 栈溢出
aa = new AA();
aa.MethodAA();
}
}

#endregion

}

 
 
posted on 2014-03-23 10:33  v.e.n.u.s 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/jx270/p/3618720.html

### Spring Boot 中通过懒加载解决循环依赖问题 在 Spring Boot 中,循环依赖通常发生在两个或多个 Bean 彼此依赖的情况下。Spring 容器会尝试解析这些依赖关系并完成对象的初始化过程[^2]。然而,在某些复杂场景下,可能会遇到循环依赖的问题。 #### 懒加载的概念 懒加载是一种延迟初始化的技术,它允许 Bean 的创建推迟到实际需要的时候才进行。这种方式可以有效避免一些循环依赖问题的发生,因为在第一次请求之前不会触发依赖的提前加载[^3]。 --- #### 配置方法 ##### 方法一:使用 `@Lazy` 注解 可以通过在其中一个 Bean 上添加 `@Lazy` 注解来实现懒加载。这样,该 Bean 只有在其被首次调用时才会被实例化,从而打破循环依赖链条。 ```java @Component public class ServiceA { @Autowired private ServiceB serviceB; } @Component @Lazy // 延迟加载 ServiceB public class ServiceB { @Autowired private ServiceA serviceA; } ``` 上述配置中,`ServiceB` 被标记为懒加载模式,因此只有当其真正被使用时才会被实例化,从而避免循环依赖问题[^1]。 --- ##### 方法二:全局启用懒加载 如果希望在整个应用范围内启用懒加载策略,可以在启动类上添加 `@Lazy` 注解: ```java @SpringBootApplication @Lazy // 全局开启懒加载 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这种方法适用于小型项目或者对性能要求不高的场景。需要注意的是,过度使用懒加载可能会影响系统的响应速度,因为它会在运行时动态加载更多资源[^4]。 --- ##### 方法三:调整设计结构 除了技术手段外,还可以重新审视项目的架构设计,尽量减少不必要的双向依赖。例如,引入第三个中间层来协调两者之间的交互逻辑,从根本上消除循环依赖的可能性。 --- ### 示例代码 以下是完整的示例代码展示如何通过懒加载解决循环依赖问题: ```java // Service A 类定义 @Service public class ServiceA { @Autowired private ServiceB serviceB; public String getMessage() { return "Message from Service A"; } } // Service B 类定义 (懒加载) @Service @Lazy public class ServiceB { @Autowired private ServiceA serviceA; public String getResponse() { return "Response from Service B with message: " + serviceA.getMessage(); } } // 测试 Controller @RestController @RequestMapping("/test") public class TestController { @Autowired private ServiceA serviceA; // 正常注入 @GetMapping("/message") public String testMessage() { return serviceA.getMessage(); // 不会立即触发 ServiceB 初始化 } @GetMapping("/response") public String testResponse(@Autowired ServiceB serviceB) { // 手动获取 ServiceB 实例 return serviceB.getResponse(); } } ``` 在这个例子中,`ServiceB` 使用了懒加载方式,因此即使存在相互依赖的关系也不会引发异常。 --- ### 总结 通过以上介绍可以看出,采用懒加载机制能够有效地缓解甚至完全规避掉因循环依赖而导致的各种错误情况发生。不过也要注意合理运用这一特性以免带来其他潜在隐患比如增加内存消耗等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值