一、什么是循环依赖
循环依赖指的是两个类中的属性各自依赖对方,比如A依赖B,B依赖A,A类中有B属性,B类中有A属性
spring在实例化其中一个类A的时候,填充属性的时候要去实例化另一个类B,而填充另外一个类B属性A的时候又发现需要原来的那个类A,导致循环引用,无限创建
演示:
创建两个相互依赖的类A.B:
配置类:
测试类:
结果:
二、解决循环依赖
1、最好的办法是重新写代码然后抽取公共的部分共同依赖,
2、将两个service进行松耦合,这种方式,我们可以将公开的方法抽成接口,而方法的实现类里面注入接口就可以,这样就不会发生循环依赖;就是在A实现类里面@Autowired B的接口,B实现类里面@Autowired A的接口,这样就不会循环依赖
3、在你注入bean的时候,在互相依赖的两个bean上加上@Lazy注解;
@Autowired
@Lazy
private A a;
@Autowired
@Lazy
private B b;