由于一些事件在ApplicaitonContext创建之前被触发,所以不能通过@Bean注解来注册Listener。可以通过SpringApplication.addListeners(...)方法或则SpringApplicationbuilder.listeners(...)方法注册监听器。
随着应用程序启动,application事件会以如下顺序触发:
1:ApplicationStartingEvent,在程序启动的时候,除处理注册listeners和initializers之前。
2:ApplicationEnvironmentPreparedEvent,在context中档Environment被使用的时候并在context被创建之前。
3:ApplicationPreparedEvent,在bean被加载之后刷新之前触发;
4:ApplicationStaredEvent,在application和command-line调用之后context刷新之前。
5:ApplicationReadyEvent,与4相反,此时应用以具备服务的能力,可以处理请求。
6:ApplicationFailedEvent,在启动过程中如果发生异常则触发。
Application事件的发送使用Spring framework的事件发布机制。该机制可以保证事件发布到注册在子容器当中的listener,也可以发布到注册在父容器当中的listener;所以一个listener会接收到多个相同类型的application事件。
1,使用配置文件的方式注册listener
1)实现org.springframework.context.ApplicationListener接口
public class MyListeners implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent arg0) {
// TODO Auto-generated method stub
System.out.println(arg0.getSource() + "happends on " +arg0.getTimestamp());
}
}
2)使用maven命令打包成可执行jar包,添加文件META-INF/spring.factories,文件内容如下:
org.springframework.context.ApplicationListener=com.zhongzhong.demo.myListener.MyListeners
3)使用“java -jar text.jar”运行,可以看到事件的输出信息:
2,使用SpringApplication.addListener(...)方式添加
1)实现org.springframework.context.ApplicationListener接口
public class MyListennerByAddedToApplication implements ApplicationListener<ApplicationEvent>{
@Override
public void onApplicationEvent(ApplicationEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getClass().isAssignableFrom(ApplicationStartingEvent.class)){
System.out.println(this.getClass()+" ApplicationStartEvent hapends");
}else if(arg0.getClass().isAssignableFrom(ApplicationEnvironmentPreparedEvent.class)){
System.out.println(this.getClass()+" ApplicationEnvironmentPreparedEvent hapends");
}else if(arg0.getClass().isAssignableFrom(ApplicationPreparedEvent.class)){
System.out.println(this.getClass()+" ApplicationPreparedEvent hapends");
}else if(arg0.getClass().isAssignableFrom(ApplicationStartedEvent.class)){
System.out.println(this.getClass()+" ApplicationStartedEvent hapends");
}else if(arg0.getClass().isAssignableFrom(ApplicationReadyEvent.class)){
System.out.println(this.getClass()+" ApplicationReadyEvent hapends");
}else if(arg0.getClass().isAssignableFrom(ApplicationFailedEvent.class)){
System.err.println(this.getClass()+" exception happends");
}
}
}
2)在main方法中添加listener
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringbootDemoApplication.class);
//application.setBanner(new MyBanner());
application.addListeners(new MyListennerByAddedToApplication());
application.run(args);
}
3)打包运行,运行结果如下: