在 Spring 中,实现“观察者模式”通常有 两种主流方式:
下面分别说明,并给可运行示例。
Spring 自带 ApplicationEvent + ApplicationListener,本质就是观察者模式。
import org.springframework.context.ApplicationEvent;
public class UserRegisterEvent extends ApplicationEvent {
private String username;
public UserRegisterEvent(Object source, String username) {
super(source);
this.username = username;
}
public String getUsername() {
return username;
}
}
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final ApplicationEventPublisher publisher;
public UserService(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void register(String username) {
System.out.println("注册用户:" + username);
publisher.publishEvent(new UserRegisterEvent(this, username));
}
}
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class EmailListener {
@EventListener
public void sendEmail(UserRegisterEvent event) {
System.out.println("发送邮件给:" + event.getUsername());
}
}
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class LogListener implements ApplicationListener<UserRegisterEvent> {
@Override
public void onApplicationEvent(UserRegisterEvent event) {
System.out.println("记录日志:" + event.getUsername());
}
}
context.getBean(UserService.class).register("tom");
输出:
注册用户:tom
发送邮件给:tom
记录日志:tom
✅ Spring 会自动管理观察者(Listener)
只需加 @Async
@EventListener
@Async
public void sendEmail(UserRegisterEvent event) {
// 异步执行
}
⚠️ 需要开启异步:
@EnableAsync
@SpringBootApplication
public class App {}
interface Observer {
void update(String msg);
}
class ConcreteObserver implements Observer {
public void update(String msg) {
System.out.println("收到:" + msg);
}
}
class Subject {
private List<Observer> observers = new ArrayList<>();
public void add(Observer o) {
observers.add(o);
}
public void notify(String msg) {
observers.forEach(o -> o.update(msg));
}
}
❌ 缺点:
| 方式 | 推荐度 | 说明 |
|---|---|---|
| Spring Event | ⭐⭐⭐⭐⭐ | 官方、解耦、易维护 |
| @EventListener | ⭐⭐⭐⭐⭐ | 最简洁 |
| 手写观察者 | ⭐⭐ | 学习用 |
如果你愿意,我可以:
@TransactionalEventListener你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。