SpringBoot监听机制
SpringBoot的监听机制,其实是对java提供的事件监听机制的封装
java监听机制
-
java中的事件监听机制定义了以下几个角色
-
事件:Event,继承java.util.EventObject类的对象
-
事件源:Source,任意对象Object
-
监听器:Listener,实现java.util.EventListener对象
-
SpringBoot监听机制
SpringBoot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作
监听器接口:ApplicationContextInitializer、SpringApplicationRunListener、CommandLineRunner、ApplicationRunner
- ApplicationContextInitializer
- 这个接口允许在应用程序上下文被创建之前对其进行定制和配置
- 可以用来做一些初始化的工作,例如添加自定义属性源、激活特定的Spring配置文件等
- 通过实现这个接口,可以在Spring应用程序上下文被创建之前对其进行自定义设置
补充:在java中,"上下文对象"通常是指一种数据结构或对象,用于存储和传递在特定环境中的相关信息或状态。这个概念在不同的技术和框架中有不同的具体实现和用法。在一些情况下,上下文对象可以是一个普通的 Java 对象,用于存储和传递方法调用或处理过程中的相关信息。例如,在多线程编程中,可以创建一个包含线程状态、线程局部变量等信息的上下文对象,以便在方法调用之间传递这些信息。在一些框架和技术中,上下文对象可能具有更具体的含义和功能。例如:
1.Servlet 上下文对象:在 Java Web 开发中,Servlet 上下文对象是用于存储 Servlet 环境相关信息的对象。它可以通过 ServletContext 接口来访问,其中包含了 Servlet 容器的一些配置信息、Servlet 的初始化参数等。2.Spring 应用程序上下文对象:在 Spring 框架中,应用程序上下文对象是 Spring IoC 容器中的一个重要组成部分,用于管理和维护 Bean 的定义、依赖关系等信息。它可以通过 ApplicationContext 接口来访问,其中包含了应用程序中所有 Bean 的定义、配置信息等。3.数据库连接上下文对象:在使用 JDBC 进行数据库操作时,可以创建一个数据库连接上下文对象,用于管理数据库连接的状态、事务信息等。总的来说,上下文对象是一种在特定环境中存储和传递相关信息的通用机制,在不同的技术和框架中具有不同的实现和用法。它可以帮助组织和管理程序执行过程中的状态和信息,提高代码的灵活性和可维护性。
-
SpringApplicationRunListener
- 这个接口用于监听SpringBoot应用程序的启动过程中的事件,例如应用程序启动、运行失败等
- 可以用来实现一些高级的应用程序启动时的逻辑,例如记录日志、发送通知等
- 通过实现这个接口,可以在应用程序启动的各个阶段添加自定义行为
-
CommandLineRunner
- 这是一个函数式接口,用于在SpringBoot应用程序启动后立即执行一些逻辑
- 它提供了一个**‘run’**方法,该方法会在SpringBoot应用程序启动后立即执行,且可以访问应用程序启动时的命令行参数
- 可以用来实现一些与命令行相关的初始化工作,例如加载数据、执行特定任务等
补充:函数式接口(Functional Interface)是指仅包含一个抽象方法的接口。Java 8 引入了函数式接口的概念,以支持函数式编程风格和Lambda表达式。函数式接口通常用于表示可以作为Lambda表达式传递的类型,或者作为方法引用的目标类型。函数式接口具有以下特征:
1.只包含一个抽象方法:函数式接口只能包含一个未实现的抽象方法。它可以包含多个默认方法或静态方法,但只能有一个抽象方法。
2.可以使用@FunctionalInterface注解:虽然不是必须的,但通常将函数式接口标记为@FunctionalInterface注解,以便编译器检查它是否符合函数式接口的要求。如果一个接口标记为@FunctionalInterface,但它不符合函数式接口的要求(例如包含多个抽象方法),编译器将产生错误。
3.Lambda表达式和方法引用的目标类型:函数式接口可以被用作Lambda表达式的类型。Lambda表达式提供了一种简洁的语法来实现函数式接口的抽象方法。同样,函数式接口也可以是方法引用的目标类型。
- ApplicationRunner
- 与**‘CommandLineRunner’**类似,也是用于在SpringBoot应用程序启动后立即执行一些逻辑的接口
- 不同之处在于,‘ApplicationRunner’的’run’方法接受的参数是’ApplicationArguments’,而不是简单的字符串数组
- **‘ApplicationArguments’**提供了更丰富的访问应用程序启动时的参数信息的能力,例如访问非标准选项、参数值的类型转换等
要使上面四种监听器接口中的ApplicationContextInitializer和SpringApplicationRunListener生效,需要在配置META-INF文件夹和其中的spring.factories
SpringBoot启动流程分析
参考12-SpringBoot流程分析-初始化_哔哩哔哩_bilibili的P29-P30
SpringBoot监控
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、bean加载情况、配置属性、日志信息等
使用步骤
- 导入依赖坐标
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
-
访问
http://localhost:8080/actuator
SpringBoot项目部署
SpringBoot项目开发完毕后,支持两种方式部署到服务器:
- jar包
- war包