我认为这与observer和publish/subscribe模式密切相关,但是由于我还没有看到使用它的产品代码,所以我有一些问题,关于你们在springboot中使用事件和事件监听器时如何组织代码(尽管我相信它可以扩展到任何语言/框架)。
假设我有3个班级和他们各自的服务:
Foo with FooService
Bar with BarService
Baz with BazService
当fooservice创建一个foo对象时,我希望barservice和bazservice执行一些代码来更新它们各自的表,例如,我发布 FooCreatedEvent
.
既然我有两种不同的服务,这里的最佳实践是什么?
解决方案1:
一个类封装了一切
public class FooEventListener {
@Autowired
private BarService barService;
@Autowired
private BazService bazService;
@EventListener
public void handleFooCreatedEvent(FooCreatedEvent event) {
barService.doSomething(event);
bazService.doSomething(event);
}
}
解决方案2:
2个类,每个类封装自己的服务
public class BarEventListener {
@Autowired
private BarService barService;
@EventListener
public void handleFooCreatedEvent(FooCreatedEvent event) {
barService.doSomething(event);
}
}
public class BazEventListener {
@Autowired
private BazService bazService;
@EventListener
public void handleFooCreatedEvent(FooCreatedEvent event) {
bazService.doSomething(event);
}
}
我喜欢解决方案2的设计,但我认为它可能有点混乱 BarEventListener
手柄 FooEvents
你们怎么看?
1条答案
按热度按时间tjrkku2a1#
第一种解决方案的缺点是,每次新服务想要侦听时,都必须对类进行编辑,因此它很可能违反了open/closed原则。第二种解决方案的缺点是,它创建了一个并行继承层次结构,使所需的类数量增加了一倍,并且仍然必须对其进行编辑才能让新服务侦听。
但是服务本身可以实现它们自己的功能
@EventListener
方法。这样新服务就不需要编辑其他类和类层次结构。如果BarService
想听听FooCreatedEvent
然后它可以在自己内部实现自己的侦听器方法,而不是在单独的类中。