由于1 bean之间存在循环依赖关系,Spring Boot应用程序无法启动

时间:2016-10-03 02:34:11

标签: java spring-boot

我正在尝试将JHipster Spring Boot应用程序从版本v1.3.6迁移到最新的Spring Boot v1.4.1。但是,当我尝试运行应用程序时,我现在收到以下错误消息:

***************************
APPLICATION FAILED TO START
***************************

Description:

There is a circular dependency between 1 beans in the application context:
    - loadSampleData (field private app.service.UserService app.sample.LoadSampleData.userService)
    - userService

我很困惑,因为UserService类对LoadSampleData类没有任何依赖性。

错误消息表明只有1个bean之间存在循环依赖关系的事实也令人困惑,因为bean如何与自身有循环依赖关系?

如果有人知道这个问题的解决方案,或者显示有关循环依赖的原因的更具体信息的方法,我们将不胜感激。

如果它有帮助,这是LoadSampleData类:

@Component
@Profile(Constants.SPRING_PROFILE_DEVELOPMENT)
public class LoadSampleData {

    private static final Logger log = LoggerFactory.getLogger(LoadSampleData.class);

    @Inject
    private UserService userService;

    @PostConstruct
    public void init() { ... }
}

2 个答案:

答案 0 :(得分:1)

事实证明,UserService与我的项目中名为EventService的另一个类有循环依赖关系。通过从EventService中删除UserService依赖项,我能够让项目运行。

LoadSampleData类与EventService没有任何依赖关系,因此我不确定为什么错误描述说问题与LoadSampleData类有关。

要找到原因,我必须通过UserService并注释掉依赖项,直到我发现导致问题的那个。

答案 1 :(得分:1)

循环依赖的两种解决方案对我有用:

1) 使用@Lazy 注解

检查控制台上的错误并在所涉及的 bean 上使用 @Lazy 注释。例如:

<div v-if="commentIndex <= commentsToShow">

然而,这种解决方案并不是最好的,因为它可以被视为不优雅,也不一定能防止将来再次发生同样的错误。

2) 重新设计

我认为这是最好的解决方案,因为你真的解决了问题的根源。

就我而言,我注意到我的堆栈跟踪中的所有“原因”都指向我的 BCryptPasswordEncoder bean,例如:

<块引用>

原因: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“userService”的 bean 时出错:依赖项不满足 通过字段“passwordEncoder”表示;嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException: 创建名为“bCryptPasswordEncoder”的 bean 时出错:请求的 bean 当前正在创建:是否存在无法解析的循环引用?

然后我意识到我的 BCryptPasswordEncoder 是在我的 SecurityConfig 类中声明的,由于我的依赖关系的特殊安排,这导致了循环引用:

<div v-if="commentIndex > 0"> 

所以解决方案是创建另一个配置类来声明 bean:

@Service
public class AuthorizationService {

    @Autowired
    @Lazy
    private EnrollmentService enrollmentService;