1.先来看一个循环依赖的demo

  1. @Service
  2. public class TestService1 {
  3. @Autowired
  4. private TestService2 testService2;
  5. @Async
  6. public void meth1() {
  7. System.out.println("testService2-meth1");
  8. testService2.meth2();
  9. }
  10. public void meth2() {
  11. System.out.println("testService2-meth2");
  12. }
  13. }
  14. @Service
  15. public class TestService2 {
  16. @Autowired
  17. private TestService1 testService1;
  18. public void meth1() {
  19. System.out.println("TestService1-meth1");
  20. testService1.meth2();
  21. }
  22. public void meth2() {
  23. System.out.println("TestService1-meth2");
  24. }
  25. }
  1. public class BeanApplication {
  2. public static void main(String[] args) {
  3. ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
  4. //User user = context.getBean(User.class);
  5. //user.sayHi();
  6. TestService1 testService1 = context.getBean(TestService1.class);
  7. testService1.meth1();
  8. }
  9. }

运行结果:
image.png
循环依赖正确执行了,那spring是如何做的呢?如下面

2.用一级缓存可以解决循环依赖吗?

可以,但无法保证多线程下的一级缓存Bean的完整性
image.png

3.用二级缓存可以解决循环依赖吗?

可以,但无法解决AOP动态代理问题
image.png

3.用三级缓存完美解决

三级缓存解决二级缓存动态代理问题
image.png