错误情况
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private GroupService groupService;
}
....
@Service
public class GroupServiceImpl implements GroupService {
@Autowired
private PersonService personService;
}
出现了一下错误:
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘personServiceImpl’: Bean with name ‘personServiceImpl’ has been injected into other beans [groupServiceImpl] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using ‘getBeanNamesOfType’ with the ‘allowEagerInit’ flag turned off, for example.
原因是:PersonServiceImpl中依赖了GroupServiceImpl,GroupServiceImpl依赖了PersonServiceImpl,出现了循环依赖
在spring官网https://www.baeldung.com/circular-dependencies-in-spring中对这个异常进行了解释:
当使用构造函数注入时;如果使用其他类型的注入,应该不会发现这个问题,因为依赖项将在需要时注入,而不是在上下文加载时注入。
spring官网提供了很多解决方法,我的解决方法是将GroupServiceImpl中在注入PersonService 类时使用@Lazy注解,就是不会完全初始化PersonService ,而是创建一个代理将其注入到另一个GroupServiceImpl中。只有在第一次需要注入的PersonService 时,才会完全创建它。
将GroupServiceImpl修改如下:
@Service
public class GroupServiceImpl implements GroupService {
private PersonService personService;
@Autowired
public GroupServiceImpl(@Lazy PersonService personService) {
this.personService = personService;
}
}
问题得到解决。
总结
在service中尽量不要注入service,否则容易出现循环注入的情况,改起来可能会特别麻烦。