@Autowired介绍
@Autowired 是 Spring 框架中用于自动装配依赖关系的注解。循环依赖是指两个或多个类相互依赖,形成一个循环链,导致在初始化这些类时产生问题。在 Spring 中,循环依赖有时难以避免,特别是在使用 @Autowired 进行自动装配时。
Spring 提供了一些机制来处理循环依赖,其中最常见的是使用三级缓存(three-level cache)来暂时存储正在创建的 bean,以防止循环依赖问题。
以下是简要的工作原理:
单例对象缓存(Singleton Object Cache): Spring 首先创建一个空的 bean 实例,并将其放入单例对象缓存中。这时,这个 bean 还没有完全初始化。
早期对象引用缓存(Early Reference Cache): 在创建 bean 的过程中,如果发现循环依赖,Spring 会提前暴露一个早期对象引用,即一个尚未完全初始化的对象,将其放入早期对象引用缓存。
三级缓存(Three-Level Cache): Spring 还维护了一个三级缓存,包含了正在创建的 bean 实例的存根。这个存根代表了 bean 的一个未完成状态。
目前需要注意:直接使用Autowired注入到bean上目前在IDEA上不推荐使用,
IDEA编辑器上推荐使用构造器或者setter的方法进行注入
-
无循环依赖可以直接使用@AllArgsConstructor
@AllArgsConstructor public class ClassA { private final ClassB classb; }
-
循环依赖可以通过@Lazy解决
@AllArgsConstructor @Lazy public class ClassA { private final ClassB classb; } @AllArgsConstructor @Lazy public class ClassB { private final ClassA classA; }
-
也可以通过一行注解达到解决循环依赖的问题
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class ClassA {
private final ClassB classb;
}
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class ClassB {
private final ClassA classA;
}