Редизайн, чтобы избежать циклической зависимости при загрузке Spring - PullRequest
0 голосов
/ 09 октября 2018

Я прочитал много статей о принципе DI в Spring Framework, но я все еще не понимаю, как разрешить циклическую зависимость в следующем случае:

Класс сущности

class Thread {
   ...
   String status;
}

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

Сервисный уровень для обработки CRUD этих 2 объектов

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 голосов
/ 09 октября 2018

Основываясь на вашем дизайне, самая опасная зависимость -

ThreadService (это должно быть изолировано) -> ReplyService .

Вы можетеотделите ваши компоненты, используя дизайн на основе событий:

ThreadService

  • вызов метода: suspend
  • отправленное событие: ThreadSuspendedEvent

ReplyService должен быть прослушивателем события ThreadSuspendedEvent, и когда событие получено, должен быть выполнен этот код:

getReplies(t).forEach(r -> {
                           r.setStatus("suspended");
                           update(r);});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...