java—组织springboot事件/事件监听器的最佳实践

a11xaf1n  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(523)

我认为这与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 你们怎么看?

tjrkku2a

tjrkku2a1#

第一种解决方案的缺点是,每次新服务想要侦听时,都必须对类进行编辑,因此它很可能违反了open/closed原则。第二种解决方案的缺点是,它创建了一个并行继承层次结构,使所需的类数量增加了一倍,并且仍然必须对其进行编辑才能让新服务侦听。
但是服务本身可以实现它们自己的功能 @EventListener 方法。这样新服务就不需要编辑其他类和类层次结构。如果 BarService 想听听 FooCreatedEvent 然后它可以在自己内部实现自己的侦听器方法,而不是在单独的类中。

相关问题