先说说什么是循环依赖,在spring中,循环依赖是指两个或多个Bean之间相互引用,形成一个循环的依赖关系,项目启动时,就会报错导致项目无法启动。
Spring解决循环依赖的步骤:使用Spring称为"三级缓存"的一种机制,来解决循环依赖问题
-
首先,当容器创建一个Bean时,它会将正在创建的Bean放入"早期对象集合"(Early Objects)中,同时将正在创建的Bean放入"当前创建Bean的缓存"(Currently created Beans Cache)中。
-
接着,Spring会处理该Bean的依赖项。如果发现依赖项也是正在创建的Bean,则Spring会从"早期对象集合"中获取该Bean,而不是等待该Bean被完全创建。
-
如果依赖项是原型作用域的Bean,则Spring会创建一个代理对象,以避免循环依赖。
-
一旦Bean创建完成,Spring将其放入"已完成对象集合"(Finished Beans)中,并从"当前创建Bean的缓存"中移除。
代码示例(仅供参考):
创建一个用户server类
@Service
public class MemberService {
public static MemberService instance(){
return SpringUtils.getBean(MemberService.class);
}
public Member test(String memberSn){
----查询方法省略
return merber;
}
}
然后创建自定义的SpringUtils类
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;public final class SpringUtils implements BeanFactoryPostProcessor{ private static ConfigurableListableBeanFactory beanFactory; public static <T> T getBean(Class<T> clz) throws BeansException { return beanFactory.getBean(clz); }}
使用方法: 比如OrderService 需要依赖MemberService
@Service
public class OrderService {
public void test(){
Member member = MemberService.instance.test(memberSn);
}
}
使用时不注入,直接调用MemberService.instance 获取到bean
总结: 需要注意的是,尽管Spring提供了解决循环依赖的机制,但仍然建议尽量避免循环依赖的情况。因为循环依赖可能导致代码的可读性和可维护性下降,同时也增加了调试和排查问题的难度。如果可能的话,应该重构代码以消除循环依赖