点击“终码一生”,关注,置顶公众号
每日技术干货,第一时间送达!
/**
* @Author JiaQIng
* @Description 修改密码事件
* @ClassName UserChangePasswordEvent
* @Date 2023/3/26 13:55
**/
@Getter
@Setter
public class UserChangePasswordEvent extends ApplicationEvent {
private String userId;
public UserChangePasswordEvent(String userId) {
super(new Object());
this.userId = userId;
}
}
/**
* @Author JiaQIng
* @Description 发送短信监听器
* @ClassName MessageListener
* @Date 2023/3/26 14:16
**/
@Component
public class MessageListener implements ApplicationListener<UserChangePasswordEvent> {
@Override
public void onApplicationEvent(UserChangePasswordEvent event) {
System.out.println("收到事件:" + event);
System.out.println("开始执行业务操作给用户发送短信。用户userId为:" + event.getUserId());
}
}
/**
* @Author JiaQIng
* @Description 事件监听器
* @ClassName LogListener
* @Date 2023/3/26 14:22
**/
@Component
public class ListenerEvent {
@EventListener({ UserChangePasswordEvent.class })
public void LogListener(UserChangePasswordEvent event) {
System.out.println("收到事件:" + event);
System.out.println("开始执行业务操作生成关键日志。用户userId为:" + event.getUserId());
}
@EventListener({ UserChangePasswordEvent.class })
public void messageListener(UserChangePasswordEvent event) {
System.out.println("收到事件:" + event);
System.out.println("开始执行业务操作给用户发送短信。用户userId为:" + event.getUserId());
}
}
// 在这个注解上面有一个注解:@EventListener,所以表明其实这个注解也是个事件监听器。
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EventListener
public @interface TransactionalEventListener {
/**
* 这个注解取值有:BEFORE_COMMIT(指定目标方法在事务commit之前执行)、AFTER_COMMIT(指定目标方法在事务commit之后执行)、
* AFTER_ROLLBACK(指定目标方法在事务rollback之后执行)、AFTER_COMPLETION(指定目标方法在事务完成时执行,这里的完成是指无论事务是成功提交还是事务回滚了)
* 各个值都代表什么意思表达什么功能,非常清晰,
* 需要注意的是:AFTER_COMMIT + AFTER_COMPLETION是可以同时生效的
* AFTER_ROLLBACK + AFTER_COMPLETION是可以同时生效的
*/
TransactionPhase phase() default TransactionPhase.AFTER_COMMIT;
/**
* 表明若没有事务的时候,对应的event是否需要执行,默认值为false表示,没事务就不执行了。
*/
boolean fallbackExecution() default false;
/**
* 这里巧妙的用到了@AliasFor的能力,放到了@EventListener身上
* 注意:一般建议都需要指定此值,否则默认可以处理所有类型的事件,范围太广了。
*/
@AliasFor(annotation = EventListener.class, attribute = "classes")
Class<?>[] value() default {};
/**
* The event classes that this listener handles.
* <p>If this attribute is specified with a single value, the annotated
* method may optionally accept a single parameter. However, if this
* attribute is specified with multiple values, the annotated method
* must <em>not</em> declare any parameters.
*/
@AliasFor(annotation = EventListener.class, attribute = "classes")
Class<?>[] classes() default {};
/**
* Spring Expression Language (SpEL) attribute used for making the event
* handling conditional.
* <p>The default is {@code ""}, meaning the event is always handled.
* @see EventListener#condition
*/
@AliasFor(annotation = EventListener.class, attribute = "condition")
String condition() default "";
/**
* An optional identifier for the listener, defaulting to the fully-qualified
* signature of the declaring method (e.g. "mypackage.MyClass.myMethod()").
* @since 5.3
* @see EventListener#id
* @see TransactionalApplicationListener#getListenerId()
*/
@AliasFor(annotation = EventListener.class, attribute = "id")
String id() default "";
}
/**
* @Author JiaQIng
* @Description 事件监听器
* @ClassName LogListener
* @Date 2023/3/26 14:22
**/
@Component
public class ListenerEvent {
@EventListener({ UserChangePasswordEvent.class })
public void logListener(UserChangePasswordEvent event) {
System.out.println("收到事件:" + event);
System.out.println("开始执行业务操作生成关键日志。用户userId为:" + event.getUserId());
}
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT,value = { UserChangePasswordEvent.class })
public void messageListener(UserChangePasswordEvent event) {
System.out.println("收到事件:" + event);
System.out.println("开始执行业务操作给用户发送短信。用户userId为:" + event.getUserId());
}
}
@SpringBootTest
class SpirngEventApplicationTests {
@Autowired
ApplicationEventPublisher appEventPublisher;
@Test
void contextLoads() {
appEventPublisher.publishEvent(new UserChangePasswordEvent("1111111"));
}
}


@EnableAsync
@SpringBootApplication
public class SpirngEventApplication {
public static void main(String[] args) {
SpringApplication.run(SpirngEventApplication.class, args);
}
}
/**
* @Author JiaQIng
* @Description 事件监听器
* @ClassName LogListener
* @Date 2023/3/26 14:22
**/
@Component
public class ListenerEvent {
@Async
@EventListener({ UserChangePasswordEvent.class })
public void logListener(UserChangePasswordEvent event) {
System.out.println("收到事件:" + event);
System.out.println("开始执行业务操作生成关键日志。用户userId为:" + event.getUserId());
}
}
-
源码:github.com/hujiaqing789/spring-boot-study.git
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
往期推荐


