如何使用 Spring Boot 注册观察者?

How to register a Observer using Spring Boot?

我想在没有 Spring 事件的情况下使用 Spring 启动来实现 GoF 观察者设计模式。
代码示例:

    @Component
    public class MyObservable extends java.util.Observable {
      void myObservableMethod(Object obj){
        notifyObservers(obj);
      }
    }

    @Component
    public class MyObserver implements java.util.Observer{  
    @Override
      public void update(java.util.Observable observable, Object obj) {
        System.out.println(obj.toString());
      }
    }
  1. java.util 类 是该模式的良好实施吗?
  2. 如何将观察者注册到 observable 中,并且仍然能够使用 Spring 依赖注入?
    我可以在哪里调用 myObserver.accept(myObservable); ?

    @Autowired
    MyObservable myObservable;
    @Autowired
    MyObserver myObservable;
    
    myObserver.accept(myObservable); //??
    

Are the java.util classes a good implementation for that pattern ?

GoF 模式及其 java 实现有点过时并且存在一些问题。
这实际上取决于您要解决的问题,但如果您的应用程序不大量使用事件并且您不想引入 spring 事件或 RxJava 之类的东西,它可能是合适的。

How can I register the observer with the observable , and still able to use Spring Depedency Injection? Where I can call myObserver.accept(myObservable); ?

请参阅下面的示例,了解如何定义一个 Observable 一些观察者,将它们连接起来,最后向它们发送一些事件。

@SpringBootApplication
public class ObserverApplication {

    public static void main(String[] args) {
        try(ConfigurableApplicationContext ctx = SpringApplication.run(ObserverApplication.class, args)){
            Observable observable = ctx.getBean(Observable.class);
            observable.notifyObservers("Hello");
        }
    }

    @Bean
    public Observable myObservable(){
        return new MyObservable();
    }

    @Bean
    MyObserver observer1(){
        return new MyObserver(1);
    }

    @Bean
    MyObserver observer2(){
        return new MyObserver(2);
    }

    @Autowired
    public void configureObservers(Observable myObservable, MyObserver observer1, MyObserver observer2){
        myObservable.addObserver(observer1);
        myObservable.addObserver(observer2);
    }

    static class MyObserver implements Observer {

        int id;

        public MyObserver(int id) {
            this.id = id;
        }

        @Override
        public void update(Observable o, Object arg) {
            System.out.println("Observer: " + id + ", Received object: " + arg);
        }
    }

    static class MyObservable extends Observable {
        @Override
        public void notifyObservers(Object arg){
            this.setChanged();
            super.notifyObservers(arg);
        }
    }
}