重新设计以避免在Spring Boot中循环依赖

时间:2018-10-09 16:48:55

标签: spring-boot dependency-injection

我已经阅读了许多有关Spring框架中DI原理的文章,但是在以下情况下,我仍然不了解如何解决循环依赖:

实体类

class Thread {
   ...
   String status;
}

class Reply {
   Thread thread;
   String status;
   ...
}

服务层来处理这两个对象的CRUD

class ThreadService {
   @Autowired private ReplyService replySvc;
   public void suspend (Thread t) {
       t.setStatus("suspended");
       replySvc.getReplies(t).forEach(r -> {
                                         r.setStatus("suspended");
                                         replySvc.update(r);});
       dao.save(t);
   }

   public void update(Thread t) {
      ...
      dao.save(t);
   }
   ...
}

class ReplyService {
   @Autowired private ThreadService threadSvc;
   public Reply create(...) {
      thread.setStatus("replied");
      threadSvc.update(thread);
      ...
      return reply;
   }

   public List<Reply> getReplies(Thread t) {
      ...
      return replies;
   }

   public void update(Reply r) {
      ...
      dao.save(r);
   }
}

两个服务都涉及另一个服务的更新调用,以更新相应的实体。 如果我想应用DI原理,应该怎么改变?

1 个答案:

答案 0 :(得分:0)

根据您的设计,最危险的依赖项是

ThreadService (应该隔离)-> ReplyService

您可以使用基于事件的设计来分离组件:

ThreadService

  • 方法调用:暂停
  • 发送事件:ThreadSuspendedEvent

ReplyService应该是事件ThreadSuspendedEvent的侦听器,并且在接收到该事件时,应执行以下代码:

getReplies(t).forEach(r -> {
                           r.setStatus("suspended");
                           update(r);});