Spring Boot 梳理 - 4个核心
- Spring Boot 魔法的核心:自动配置、起步依赖、命令行界面、Actuator
- 自动配置:
- 不用手动配置JdbcTemplate的Bean
- 不用手动配置DataSource的Bean
- Spring Boot 为常见应用场景进行自动配置。
- 如果Spring Boot 在Classpath中发现了H2数据库,那么它就自动配置一个H2嵌入式数据库
- 如果在Classpath中发现了JdbcTemplate,那么它就会为你配置一个JdbcTempalte的Bean
- 自动配置还包括 Java持久化API(Java Persistence API,JPA)、Thymeleaf模板、安全和Spring MVC
- 简而言之,SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。
- 举几个例子,下面这些情况都是SpringBoot的自动配置要考虑的。
-
Spring的JdbcTemplate是不是在Classpath里?如果是,并且有DataSource的Bean,则自动配置一个JdbcTemplate的Bean。 Thymeleaf是不是在Classpath里?如果是,则配置Thymeleaf的模板解析器、视图解析器以及模板引擎。
Spring Security是不是在Classpath里?如果是,则进行一个非常基本的Web安全设置。
每当应用程序启动的时候,SpringBoot的自动配置都要做将近200个这样的决定,涵盖安全、集成、持久化、Web开发等诸多方面。所有这些自动配置就是为了尽量不让你自己写配置。
-
- 所有这些配置如此与众不同,原因在于它们利用了Spring的条件化配置,这是Spring 4.0引入的新特性。条件化配置允许配置存在于应用程序中,但在满足某些特定条件之前都忽略这个配置。
- 起步依赖
- 起步依赖其实就是特殊的Maven依赖或Gradle依赖
- 把常用库聚合在一起,组成几个特定功能而定制的依赖
- 起步依赖把你从“需要哪些库的哪些版本”中解脱出来,且不用担心库之间的兼容性
- 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM)
- 不需要指定版本号,起步依赖本身的版本是由正在使用的Spring Boot的版本来决定的,而起步依赖则会决定它们引入的传递依赖的版本。
- 显示依赖树:mvn dependency:tree
- 起步依赖和你项目里的其他依赖没什么区别。也就是说,你可以通过构建工具中的功能,选择性地覆盖它们引入的传递依赖的版本号,排除传递依赖,当然还可以为那些Spring Boot起步依赖新增没有涵盖的库指定依赖。
- 示例:排除
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> </exclusions> </dependency>
-
- 示例:覆盖
-
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.3</version> </dependency> Maven总是会用最近的依赖,也就是说,你在项目的构建说明文件里增加的这个依赖,会覆盖传递依赖引入的另一个依赖。
-
- 示例:排除
- 命令行界面
- Spring Boot CLI是Spring Boot的非必要组成部分。虽然它为Spring带来了惊人的力量,大大简化了开发,但也引入了一套不太常规的开发模型。要是这种开发模型与你的口味相去甚远,那也没关系,抛开CLI,你还是可以利用Spring Boot提供的其他东西。
- Actuator
- Actuator
则要提供在运行时检视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况了,包括如下细节:\- Spring应用程序上下文里配置的Bean
- Spring Boot的自动配置做的决策
- 应用程序取到的环境变量、系统属性、配置属性和命令行参数
- 应用程序里线程的当前状态
- 应用程序最近处理过的HTTP请求的追踪情况
- 各种和内存用量、垃圾回收、Web请求以及数据源用量相关的指标
- Actuator通过Web端点和shell界面向外界提供信息。如果要借助shell
- Actuator