Spring高频面试题:如何解决循环依赖问题!

循环依赖问题全景图

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

什么是循环依赖问题?

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

循环依赖问题案例分析

演示代码:

public class ClassA {
 private ClassB classB;

 public ClassB getClassB() {
  return classB;
 }

 public void setClassB(ClassB classB) {
  this.classB = classB;
 }
}
public class ClassB {
 private ClassA classA;

 public ClassA getClassA() {
  return classA;
 }

 public void setClassA(ClassA classA) {
  this.classA = classA;
 }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd"
>


 <bean id="classA" class="ioc.cd.ClassA">
  <property name="classB" ref="classB"></property>
 </bean>
 <bean id="classB" class="ioc.cd.ClassB">
  <property name="classA" ref="classA"></property>
 </bean>
</beans>

测试代码:

@Test
public void test() throws Exception {
 // 创建IoC容器,并进行初始化
 String resource = "spring/spring-ioc-circular-dependency.xml";
 ApplicationContext context = new ClassPathXmlApplicationContext(resource);
 // 获取ClassA的实例(此时会发生循环依赖)
 ClassA classA = (ClassA) context.getBean(ClassA.class);
}

通过Spring IOC流程的源码分析循环依赖问题:

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

以上案例有几种循环依赖问题?

循环依赖问题在Spring中主要有三种情况:

其实也很好解释:

如何解决循环依赖问题?

那Spring到底是如何解决的setter方法依赖注入引起的循环依赖问题呢?请看下图(其实主要是通过两个缓存来解决的):

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

Spring三大缓存介绍

Spring中有三个缓存,用于存储单例的Bean实例,这三个缓存是彼此互斥的,不会针对同一个Bean的实例同时存储。

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

一级缓存:Map<String, Object> singletonObjects

第一级缓存的作用?

存储什么数据?

第二级缓存:Map<String, Object> earlySingletonObjects

第二级缓存的作用?

存储什么数据?

第三级缓存:Map<String, ObjectFactory<?>> singletonFactories

第三级缓存的作用?

通过ObjectFactory对象来存储单例模式下提前暴露的Bean实例的引用(正在创建中)。该缓存是对内使用的,指的就是Spring框架内部逻辑使用该缓存。此缓存是解决循环依赖最大的功臣

存储什么数据?

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

Spring高频面试题:如何解决循环依赖问题!-LMLPHP

总结

以上就是Spring解决循环依赖的关键点!总结来说,就是要搞清楚以下几点:


本文分享自微信公众号 - 会呼吸的Coder(BreathCoder)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

04-09 02:20