如何使用Spring Boot注册Observer?

时间:2017-06-22 01:31:07

标签: java spring-boot observer-pattern

我想使用没有Spring事件的Spring Boot实现GoF Observer设计模式。
代码示例:

    @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 Depedency Injection? 我可以在哪里调用myObserver.accept(myObservable); ?

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

1 个答案:

答案 0 :(得分:1)

  

java.util类是该模式的一个很好的实现吗?

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

  

如何使用observable注册观察者,并且仍然可以   使用Spring Depedency Injection?在哪里我可以打电话   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);
        }
    }
}