Java 杂谈Spring学习笔记

3-Application事件和监听器

2018-10-02  本文已影响3人  中_中_

由于一些事件在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”运行,可以看到事件的输出信息:


image.png

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)打包运行,运行结果如下:


image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读