• 六种方式,教你在SpringBoot初始化时搞点事情!


    1、监听容器刷新完成扩展点ApplicationListener<ContextRefreshedEvent>

    ApplicationContext事件机制是观察者设计模式实现的,通过ApplicationEvent和ApplicationListener这两个接口实现ApplicationContext的事件机制。

    Spring中一些内置的事件如下:

    1. ContextRefreshedEvent:ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext接口中使用 refresh() 方法来发生。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用。
    2. ContextStartedEvent:当使用 ConfigurableApplicationContext (ApplicationContext子接口)接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
    3. ContextStoppedEvent:当使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
    4. ContextClosedEvent:当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
    5. RequestHandledEvent:这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。只能应用于使用DispatcherServlet的Web应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。

    好了,了解上面这些内置事件后,我们可以监听ContextRefreshedEvent在Spring Boot 启动时完成一些操作,代码如下:

    @Component
    public class TestApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
        @Override
        public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
            System.out.println(contextRefreshedEvent);
            System.out.println("TestApplicationListener............................");
        }
    }

    高级玩法

    可以自定事件完成一些特定的需求,比如:邮件发送成功之后,做一些业务处理。

    1. 自定义EmailEvent,代码如下:
    public class EmailEvent extends ApplicationEvent{
       private String address;
       private String text;
       public EmailEvent(Object source, String address, String text){
       super(source);
          this.address = address;
          this.text = text;
       }
       public EmailEvent(Object source) {
         super(source);
       }
       //......address和text的setter、getter
    }

    https://www.cnblogs.com/cbvlog/p/15174431.html

    故乡明
  • 相关阅读:
    OOP、DI、IOC的情爱恩仇录
    NuGet:添加EntityFramework
    DataGrid之DataGridComboBoxColumn,DataGridCheckBoxColumn,DataGridHyperlinkColumn,DataGridTextColumn
    JohnSon:动态创建模块选项卡
    maf实例
    MVVM理解之逐步重构成为MVVM模式,比MVC的独到之处
    我学Unity系列1:Unity和Mef的比较
    微软一站式代码资料
    匿名方法,泛型委托,Lambda表达式
    关于JS表单验证(转)
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/15203222.html
Copyright © 2020-2023  润新知