之前写SpringBoot系列的文章,已经是1年前了,如果没什么特殊需求,基本不会去改动代码,自己写的东西多了,重构代码就相当费劲,因为要做SpringCloud,打算用SpringBoot2重构一下系统。
与传统的Spring不同,SpringBoot有很多默认配置,就像HandlerMethodReturnValueHandler接口,框架直接帮我们写了一个,自己再写直接就不生效了。
系统事件,主要作用在启动方面:
1、ApplicationStartingEvent:springboot启动开始的时候执行的事件,在该事件中可以获取到SpringApplication对象,可做一些执行前的设置。
2、ApplicationEnvironmentPreparedEvent:spring boot 对应Enviroment已经准备完毕,但此时上下文context还没有创建。在该监听中获取到ConfigurableEnvironment后可以对配置信息做操作,例如:修改默认的配置信息,增加额外的配置信息等等。
3、ApplicationPreparedEvent:SpringBoot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。在获取完上下文后,可以将上下文传递出去做一些额外的操作。
4、创建对象
5、初始化对象
6、ApplicationStartedEvent:在刷新上下文之后但在调用任何应用程序和命令行运行程序之前发送ApplicationStartedEvent。在调用任何应用程序和命令行运行程序之后发送ApplicationReadyEvent。 它表明该应用程序已准备好处理请求
7、ApplicationReadyEvent:springboot 加载完成时候执行的事件
8、ApplicationFailedEvent:spring boot启动异常时执行事件,在异常发生时,最好是添加虚拟机对应的钩子进行资源的回收与释放,能友善的处理异常信息
上下文事件:功能很像Spring中的容器后置处理器,在Boot命名为上下文事件:
1、ContextClosedEvent(容器关闭时)
2、ContextRefreshedEvent(容器刷新时)
3、ContextStartedEvent(容器启动时候)
4、ContextStoppedEvent(容器停止的时候)
侦听的基本用法,不同侦听修改泛型即可
package cn.seaboot.plugin.config; import cn.seaboot.common.eventbus.EventBus; import cn.seaboot.common.file.FreeMarkers; import cn.seaboot.common.quartz.QuartzUtils; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.context.ApplicationListener; /** * 应用启动侦听 * ApplicationStartingEvent * ApplicationEnvironmentPreparedEvent * ApplicationPreparedEvent * -> create Object * -> Object init * ApplicationStartedEvent * ApplicationReadyEvent * ApplicationFailedEvent * * ContextClosedEvent(容器关闭时) * ContextRefreshedEvent(容器刷新时) * ContextStartedEvent(容器启动时候) * ContextStoppedEvent(容器停止的时候) * * @author ChenSS on 2017年8月21日 */ public class ApplicationPreparedListener implements ApplicationListener<ApplicationPreparedEvent> { @Override public void onApplicationEvent(ApplicationPreparedEvent applicationStartedEvent) { EventBus.init(); QuartzUtils.init(); FreeMarkers.defaultConfiguration(); } }
这里直接手动添加到系统中去,可以使用@Configuration注解。
/** * Application starter * @author Mr.css * @date 2019/12/10 */ @EnableCaching @SpringBootApplication @MapperScan("cn.seaboot.admin.dao") public class AdminApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(AdminApplication.class); springApplication.addListeners(new ApplicationPreparedListener()); springApplication.addListeners(new ApplicationStartedListener()); springApplication.addListeners(new ContextClosedListener()); springApplication.run(args); } }
Spring通用:
InitializingBean(在所有的Bean互相注入和Properties参数设置之后,调用init之前)
DisposableBean(调用Bean的destory之前)
BeanPostProcessor :可以在Bean创建之后,在初始化之前、初始化之后,进行一些额外的操作。
BeanFactoryPostProcessor :在所有的Bean初始化之前,进行一些额外的操作,例如:手动注册对象到Spring容器。