共计 2640 个字符,预计需要花费 7 分钟才能阅读完成。
一、简介
Spring框架提供了事件与监听机制,用于实现松耦合和事件驱动的编程模型。这个机制基于观察者设计模式,其中包含三个重要组件:事件(Event)、事件发布器(Event Publisher)和监听器(Listener)。
1. 事件(Event)
事件是系统中发生的特定动作或状态变化的表示。在Spring中,事件通常被定义为Java类,可以包含事件相关的数据和操作,并且该类需要继承 ApplicationEvent 类。
例如,可以定义一个名为 AuthUpdateEvent 的事件,表示更新权限的动作,这个动作在很多情况下都会触发,比如用户更新了角色,角色更新了菜单等等。
2. 监听器(Listener)
监听器是用于监听特定类型事件并在事件发生时执行相应操作的组件。在Spring中,可以通过实现 ApplicationListener 接口或使用 @EventListener 注解来定义监听器。监听器需要注册到事件发布器中,以便接收并处理相应的事件。
例如,定义 AuthUpdateListener,当监听到 AuthUpdateEvent 事件时,就执行其 onApplicationEvent 方法。
3. 事件发布器(Event Publisher)
事件发布器负责发布事件,即将事件通知给所有对该事件感兴趣的监听器。在Spring中,可以通过ApplicationContext或ApplicationEventPublisher接口来实现事件的发布。事件发布器会将事件传递给注册的监听器。
二、实际使用
1. 流程
-
定义事件:创建一个继承自 ApplicationEvent 的事件类,表示一个特定的事件。
-
注册监听器:创建一个实现了 ApplicationListener 接口的监听器类,并将其注册到Spring 容器中。可以通过实现接口的方式或使用 @EventListener 注解的方式进行注册。
-
发布事件:在需要的地方,通过 ApplicationEventPublisher接口的实例(如ApplicationContext或通过依赖注入获得的实例)发布事件。
-
监听事件并处理:注册的监听器会接收到发布的事件,并执行相应的操作。监听器需要实现onApplicationEvent 方法,在该方法中编写事件处理逻辑。
2. 代码
接下来实现用户更新角色后,更新权限的问题。
2.1 定义事件
public class AuthUpdateEvent extends ApplicationEvent {
private User user;
public AuthUpdateEvent(Object source, User user) {
super(source);
this.user = user;
}
public User getUser() {
return user;
}
}
定义一个事件,事件里面包含一个 User 对象作为事件的数据。
@Data
public class User {
int age;
String username;
}
2.2 定义监听器
@Component
public class AuthUpdateListener implements ApplicationListener<AuthUpdateEvent> {
@Override
public void onApplicationEvent(AuthUpdateEvent event) {
User user = event.getUser();
// 更新用户权限
System.out.println("实现接口方式===========监听事件执行,更新用户"+ user.getUsername() + "的权限");
}
}
定义一个监听器,监听到事件发布后指定 onApplicationEvent 方法。
定义监听器还可以通过另外一种方式,这种方式使用 @EventListener 注解。
@Component
public class AuthUpdateListener2 {
@EventListener
public void onApplicationEvent(AuthUpdateEvent event) {
User user = event.getUser();
// 更新用户权限
System.out.println("注解方式===========监听事件执行,更新用户"+ user.getUsername() + "的权限");
}
}
2.3 定义事件发布器
事件发布一般都在业务层,这里定义一个 UserService。
接口类:
public interface UserService {
void updateUserRole(User user);
}
实现类:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private ApplicationEventPublisher eventPublisher;
@Override
public void updateUserRole(User user) {
System.out.println("UserService执行更新角色操作");
eventPublisher.publishEvent(new AuthUpdateEvent(this, user));
}
}
2.4 测试
由于这里是 spring 测试环境,所以还需要将上面的组件注册到容器中,需要定义一个 Spring 配置类,并进行组件扫描。
@Configuration
@ComponentScan("com.amjun.extend.event")
public class SpringConfig {
// 由于只做组件扫描,没有其他的代码
}
测试类如下:
public class ApplicationContextTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = applicationContext.getBean(UserService.class);
User user = new User();
user.setUsername("zhangsan");
userService.updateUserRole(user);
}
}
提醒:本文发布于425天前,文中所关联的信息可能已发生改变,请知悉!