如何使用 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());
}
}
- java.util 类 是该模式的良好实施吗?
如何将观察者注册到 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);
}
}
}
我想在没有 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());
}
}
- java.util 类 是该模式的良好实施吗?
如何将观察者注册到 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);
}
}
}