【問題】實現ApplicationListener接口和實現SmartApplicationListener 接口?
實現ApplicationListener接口針對單一事件監聽
實現SmartApplicationListener 接口針對多種事件監聽
其它注意:
Order值越小越優先執行
使用application.properties中定義的優於其它方式
【問題】如何自定義監聽器?
一、實現方式1
1、創建監聽器類FirstListener.java
@Order(1)
public class FirstListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("hello, first listener");
}
}
2、在spring.factories文件中增加配置監聽器
org.springframework.context.ApplicationListener=com.example.demo.listener.FirstListener

3、運行查看效果

二、實現方式2
1、創建監聽器類
@Order(2)
public class SecondListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("hello, second listener");
}
}
2、實例化SpringApplication,然后增加監聽器
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class Sb2Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Sb2Application.class);
springApplication.addListeners(new SecondListener());
springApplication.run(args);
}
}
3、運行

三、實現方式3
1、創建監聽器類
@Order(3)
public class ThirdListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("hello, third listener");
}
}
2、在application.propeties 文件中配置如下

3、運行

第三個監聽器Order為3,但是卻最早打印出來。原理類似於初始化器。DelegatingApplicationListener類里定義的Order為0
四、實現方式4
1、創建監聽器類
@Order(4)
public class FourthListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationStartedEvent.class.isAssignableFrom(eventType) ||
ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("hello fourth listener");
}
}
設置感興趣的事件為ApplicationStartedEvent和ApplicationPreparedEvent
2、以追加的方式在application.properties配置

3、運行

可以發現打印了兩次,因為它對ApplicationStartedEvent和ApplicationPreparedEvent兩種事件感興趣。
