1:spring基本内建event
ContextRefreshedEvent:当ApplicationContext容器初始化完成或者被刷新的时候,就会发布该事件 ,就是调用refresh。
ContextStartedEvent:当ApplicationContext启动的时候发布事件,即调用ConfigurableApplicationContext接口的start方法的时候
ContextStoppedEvent:当ApplicationContext容器停止的时候发布事件,即调用ConfigurableApplicationContext的close方法的时候
ContextClosedEvent,当ApplicationContext关闭的时候发布事件,即调用ConfigurableApplicationContext的close方法的时候,关闭指的是所有的单例Bean都被销毁。
RequestHandledEvent 只能用于DispatcherServlet的web应用,Spring处理用户请求结束后,系统会触发该事件。
2:自定义事件
实现方法:
自定义需要发布的事件类,需要继承ApplicationEvent类或PayloadApplicationEvent<T>(该类也仅仅是对ApplicationEvent的一层封装)
使用@EventListener来监听事件
使用ApplicationEventPublisher来发布自定义事件(@Autowired注入即可)
1 :创建事件, 新建类继承ApplicationContextEvent继承ApplicationEvent或相应子类
public class UserRegisterEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
public UserRegisterEvent(Object source) {
super(source);
}
}
4.2版本之后,不再强制要求继承ApplicationEvent,非ApplicationEvent子类的对象将被包装成PayloadApplicationEvent,其源码中的payload既我们传入的事件对象。
2.创建监听类
1. 使用注解@EventListener(在spring4.2版中,允许在任一bean的对应方法上注解@EventListener来标记该bean实现了listener方法)
//监听事件
@EventListener
public void listenEvent( UserRegisterEvent event) {
System.out.println("监听到event事件; 接收到的值:" + event.getData() + ";发布的时间为" + Instant.ofEpochMilli(event.getTimestamp()));
}
2 实现 ApplicationListener接口
public class MyEventListener implements ApplicationListener<UserRegisterEvent >{
@Override
public void onApplicationEvent(UserRegisterEvent event) {
log.info("from MyEventListener :" + event);
log.info("event type: "+event.getClass());
}
}
3. 使用ApplicationEventPublisher
来发布自定义事件(@Autowired
注入即可)(或者ApplicationContext)
@Service
public class UserService {
@Autowired
ApplicationEventPublisher applicationEventPublisher;
public void register(String username) {
System.out.println("用户:" + username + "注册成功!");
applicationEventPublisher.publishEvent(new UserRegisterEvent(username));
}
}
如果需要异步则需要开启异步支持,在监听器方法加上@Async
注解即可
前提是开始事件异步
springboot开启事件异步设置:
@SpringBootApplication
@MapperScan("com.pengshu.magicwallet.mapper")
@PropertySource("classpath:authority.properties")
@EnableTransactionManagement
@EnableAsync //开启spring事件异步设置,加@Async注解
public class MagicWalletAdminApplication {
public static void main(String[] args) {
SpringApplication.run(MagicWalletAdminApplication.class, args);
}
在监听器方法加上@Async
注解即可: