天天看点

飞5的Spring Boot2(11)- 自定义事件

飞5的Spring Boot2(11)- 自定义事件

自定义SpringApplication​

如果默认的SpringApplication的默认设置不符合您的喜好,那么可以通过自定义对其进行设置。

比如不显示bannner,我们可以这样写:

1public static void main(String[] args) {
2    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
3    app.setBannerMode(Banner.Mode.OFF);
4    app.run(args);
5}      

这样在启动应用的时候我们就能够看到不加载banner信息了!

注意:

传递给SpringApplication的构造函数的参数是Spring bean的配置源。 在大多数情况下,它们都是对@Configuration类的引用,也可能是对XML配置或应扫描的包的引用。

如果不通过代码配置,可以直接通过application.properties对需要修改的内容进行配置。

流生成器API

如果你想构建层次结构的程序,可以使用SpringApplicationBuilder。通过SpringApplicationBuilder来对SpringApplication的属性进行配置,这样的结构更有层次感。SpringApplicationBuilder为构建 SpringApplication 和 ApplicationContext 实例提供了一套便利的流式API:示例代码如下:

1new SpringApplicationBuilder()
2        .sources(Parent.class)
3        .child(Application.class)
4        .bannerMode(Banner.Mode.OFF)
5        .listeners(new MyListener())
6        ...
7        .run(args);      

注意:

SpringApplication将会根据需要创建一个ApplicationContext,默认情况下,如果是非web应用,则会创建一个AnnotationConfigApplicationContext上下文,如果是web应用,则会创建一个AnnotationConfigEmbeddedWebApplicationContext上下文。当然,你也可以通过setWebEnvironment(boolean webEnvironment)来覆盖默认的设置。

事件监听

spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利。

应用事件按如下顺序运行:

  1. ApplicationStartingEvent在运行开始时但在任何处理之前发送,除了注册侦听器和初始化器之外。
  2. 当在上下文中使用的环境是已知的但在创建上下文之前发送ApplicationEnvironmentPreparedEvent。
  3. ApplicationPreparedEvent在刷新开始之前但在bean定义加载之后发送。
  4. 在刷新上下文之后但在调用任何应用程序和命令行参赛者之前发送ApplicationStartedEvent。
  5. ApplicationReadyEvent在任何应用程序和命令行参数被调用后发送。 它表示应用程序已准备好为请求提供服务。
  6. 如果启动时出现异常,则发送ApplicationFailedEvent。

以上这些事件默认不需要修改。

ApplicationListener

在一些业务场景中,当容器初始化完成之后,需要处理一些操作,比如一些数据的加载、初始化缓存、特定任务的注册等等。这个时候我们就可以使用Spring提供的ApplicationListener来进行操作。

首先,需要实现ApplicationListener接口并实现onApplicationEvent方法。把需要处理的操作放在onApplicationEvent中进行处理:

1public class ApplicationStartListener implements ApplicationListener<ContextRefreshedEvent>{
2    @Override
3    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
4        System.out.println("我的父容器为:" + contextRefreshedEvent.getApplicationContext().getParent());
5        System.out.println("初始化时我被调用了。");
6    }
7}      
1@Configuration
2public class ListenerConfig {
3    @Bean
4    public ApplicationStartListener applicationStartListener(){
5        return new ApplicationStartListener();
6    }
7}      
12018-05-03 11:01:36.272  INFO 12092 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2我的父容器为:null
3初始化时我被调用了。
42018-05-03 11:01:36.467  INFO 12092 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
52018-05-03 11:01:36.473  INFO 12092 --- [           main] com.cloud.skyme.Application              : Started Application in 5.556 seconds (JVM running for 7.162)