springboot官方文档回顾复习
一、基础概念
-
关于部署:使用
Java - jar
进行$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
而打包后的jar程序,也支持通过命令行参数开启远程调试服务,如下:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myapplication-0.0.1-SNAPSHOT.jar
-
@RequestMapping / @RestController
,他们是原型注解,可为代码人进行阅读的提示,当然也为spring在处理web请求时,找到入口,此外他们内部可以提供路由的信息,将任何的HTTP请求都映射到该方法上,并且按照编码进行不同类型的数据的返回。【他们是一个有来有往的过程】 -
@SpringBootApplication
,首先它是一个元注解,并且包括了@SpringBootConfiguration 等价于@Configuration、@EnableAutoConfiguration、@ComponentScan
,如上注解。 -
@EnableAutoConfiguration
:启用Spring Boot的自动配置机制。 -
@ComponentScan
:对应用程序所在的包启用@Component
扫描(见最佳实践)。 -
@SpringBootConfiguration
:允许在Context中注册额外的Bean或导入额外的配置类。这是Spring标准的@Configuration
的替代方案,有助于在你的集成测试中检测配置。 -
spring-boot-starter-web
添加了Tomcat和SpringMVC,自动配置你当前开发的一个Web应用 -
main方法是一个标准的Java入口方法,通过调用run,把我们当前的应用托付给SpringApplication,启动我们的应用程序后,又将会自动配置Tomcat服务器
-
jar文件=你编译类+代码运行所需要的jar依赖项的压缩包
-
如何创建一个可执行的jar呢?
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
配置好,pom.xml文件后,我们再运行
mvn package
即可,这时,我们就能在target目录下看到这个文件了,而名为myproject-0.0.1-SNAPSHOT.jar.original
。 这是Maven在被Spring Boot重新打包之前创建的原始jar文件。提多一嘴:关于
mvn package
命令的使用,没有ideal内部集成了maven管理工具好用,具体操作步骤如下:-
如果本地有target,先全部删掉,如果没有请忽视!
-
第一,找到maven管理插件的lifecycle,然后点击install,一键生成jar以及相关的依赖
-
第二,我们可以通过java -jar 来运行当前的jar包,也可以加上 --debug来查看相关内容,当然我这里主要看的是自动装配的信息。
-
我们知道,HikariDataSource数据库连接池是一个java数据库连接池的实现,一个用于管理数据库连接的工具,可以帮助优化数据库的创建和销毁过程,提高数据库的操作性能和效率。好,这个时候我想提出一个问题,那就是我当前项目【classpath】并没有对这个类以及相关的内容进行配置,即没有使用到
@Configuration
那么这个是怎么实现自动装配的呢?-
我们在启动类中点击
@SpringBootApplication
,然后再进入@EnableAutoConfiguration
我们这时会看到@Import(AutoConfigurationImportSelector.class)
不同springboot的版本存在差异,显示会不大相同。 -
好,然后我们进入当前的类中,我们可以看到在这个list集合中是来获取对应的自动配置的文件信息
-
再移步到方法体的详细中,我们可以看到,一句这样的话“如果没有自动装配的类的话,会到META-INF下寻找文件,如果你有自己的话,请确保他能够正常的文件格式来进行配置”
-
根据提供的消息,我们不难发现,我们要找的地方,好,现在有一个问题那就是不是配置列表中含有调用就一定会被自动装配了,你还需要导入相对应的starter
-
-
-
关于升级,如果遇到在升级过程中,一些属性或者是包被重新命名或者删除,那么我们该如何分析当前的应用程序并打印诊断的结果呢,此外它还能在运行时为你临时迁移属性
-
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
二、使用
-
我们应该使用一个合理的依赖管理工具进行应用程序的管理(maven 或者 Gradle),而每个Spring Boot的每个版本都提供了一个所支持的依赖列表,在构建中不需要特别说明这些依赖声明,因为其会自动为你管理。
-
Starter是一系列开箱即用的依赖,你可以在你的应用程序中导入它们。 通过你Starter,可以获得所有你需要的Spring和相关技术的一站式服务,免去了需要到处大量复制粘贴依赖的烦恼。 例如,如果你想开始使用Spring和JPA进行数据库访问,那么可以直接在你的项目中导入
spring-boot-starter-data-jpa
依赖。按我目前的理解就是,使用这个Starter可以一键引入需要的服务的依赖到maven或者Gradle中。命名规则,一般spring-boot-开头的命名是留给官方的,而自己或者别人的第三方库的依赖的话,可以以项目的名字开头为好。例如,一个名为thirdpartyproject
的第三方启动器项目通常被命名为thirdpartyproject-spring-boot-starter
。 -
代码的结构
-
“dafault"包 ,当一个类不包括
package
的声明时,它被认为是在 “default package” 中。 通常应避免使 “default package”。 对于使用了@ComponentScan
,@ConfigurationPropertiesScan
,@EntityScan
或者@SpringBootApplication
注解的Spring Boot应用程序来说,它可能会造成一个问题:项目中的所有jar里面的所有class(也就包括了我们导入的一些依赖的jar包)都会被读取(扫描)。推荐:遵循Java推荐的包的命名惯例,使用域名反转作为包名(例如,com.example.project
)。 -
启动类的位置:放在一个根package中,高于其他的类,
@SpringBootApplication
注解【默认只会扫描加载你项目工程的组件】一般都是注解在启动类上的。它默认会扫描当前类下的所有子包。 -
Configuration 类: Spring Boot倾向于通过Java代码来进行配置的定义。 虽然也可以使用XML来配置
SpringApplication
,但还是建议你通过@Configuration
类来进行配置。 通常,可以把启动类是 的@SpringBootConfiguration
注解是一个特殊@Configuration
类注解,功能一样,只是为了区分而已。 -
自动装配:Spring Boot的自动装配机制会试图根据你所添加的依赖来自动配置你的Spring应用程序。 例如,如果你添加了
Mysql
依赖,而且你没有手动配置任何DataSource Bean,那么Spring Boot就会自动配置内存数据库。如果你需要配置一些相关的参数或者其他的什么东西,你就需要在config包建立一个项目的config类,然后注解添加到你的@Configuration
类中,并且进行你需要的需求配置,从而开启**定制化的自动配置功能。特别地:自动配置是非侵入性**的。 在任何时候,你都可以开始定义你自己的配置来取代自动配置的特定部分。 例如,如果你添加了你自己的DataSource
bean,默认的嵌入式数据库支持就会“退步”从而让你的自定义配置生效。如果你想知道在应用中使用了哪些自动配置,你可以在启动命令后添加--debug
参数。 这个参数会为核心的logger开启debug级别的日志,会在控制台输出自动装配项目以及触发自动装配的条件。【下图显示的就是自动装配的功能,这里我们通过debug进行了打印,应用运行失败,是因为我后台没有打开mysql服务】 -
如果你想禁用掉项目中某些自动装配类的话,可以使用:
1. - @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
注:如果要禁用的自动装配类不在classpath上(没有导入),那么你可以在注解的
excludeName
属性中指定类的全路径名称。exclude
和excludeName
属性在@EnableAutoConfiguration
中也可以使用。 最后,你也可以在配置文件中通过spring.autoconfigure.exclude[]
配置来定义要禁用的自动配置类列表。 -
-
Spring Bean 和 依赖注入:使
@ComponentScan
注解来扫描Bean,所以类【组件】中当标注上(@Component
、@Service
、@Repository
、@Controller
和其他)都会自动注册为Spring Bean。有如下的例子:@Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }
但如果一个Bean有多个构造函数,这是可以使用
@Autowired
来告诉Spring应该用哪个构造函数进行注入,代码如下[下面实现了构造器的重载]:import java.io.PrintStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; private final PrintStream out; @Autowired public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; this.out = System.out; } public MyAccountService(RiskAssessor riskAssessor, PrintStream out) { this.riskAssessor = riskAssessor; this.out = out; } // ... }
- 上面的例子中,我们通过构造器的方式注入,而
riskAssessor
字段被标示成为final
表示这个Bean的这个字段一旦被创建后就不在更改,这是一种推荐的做法!
- 上面的例子中,我们通过构造器的方式注入,而
-
-
SpringBoot devtools实现热部署说明:
-
是对修改的类和配置文件进行重新加载,因此会看到项目的启动过程,但是本质上只是对修改类和配置文件进行重新加载,速度很快的 (原理:通过两个类的加载实现了重启,例如来自第三方jar的类,被加载到了一个base classloader中,而在开发过程中的类被加载到restart classloader。当应用程序被重新启动的时候,restart classloader被丢弃,并被创建一个新的,而这意味着重新启动比“冷启动”快得多,因为 base classloader 已经可用并被填充)
-
spring-boot-devtools 对于前端使用模板引擎的项目,能够自动禁用缓存,在页面修改后,只需要刷新浏览器器页面即可。
-
缓存可以提高性能,但在有模板引擎的开发中,模板引擎会缓存编译过的模板,防止重复解析模板,这会导致修改页面内容时,模板引擎不去重新解析模板,看不到修改过的内容,但devtools在开发环境中默认关闭模板引擎的缓存功能。devtools不会被打包进jar包或war包中,在生产环境中,模板引擎的缓存功能就可以正常使用了。
-
触发重启的唯一办法是更新classpath,而重新编译是来触发重启,这里我使用构建的方式运行Maven的 mvn compile会触发重启。restart与LiveReload一起使用时,自动重启的效果很不错,如果使用JRebel,自动重启被禁用,而采用动态类重载。而在AspectJ切面时,不支持自动重启。
-
记录条件评估的变化:默认情况下,每次你的应用程序重新启动时,都会记录一份显示条件评估delta的报告。 该报告显示了你的应用程序的自动配置的变化,因为你做了一些改变,如添加或删除Bean和设置配置属性。
配置如下:导入包后,进行如下配置,可以触发自动重启的功能。
# 热部署工具 spring.devtools.restart.enabled=true # 设置重启的目录 spring.devtools.restart.additional-paths= src/main/java spring.devtools.livereload.enabled=true
-
-
三、核心特性
-
启动失败,默认下,会显示
INFO
级别的日志信息,包括一些相关的启动细节,比如启动应用程序的用户。如果需要使用INFO
以外级别的日志,可以设置它,比如“日志级别”中所示。启动信息的记录可以通过设置==spring.main.log-startup-info
== 为false
来关闭。 这也将关闭应用程序的激活的profiles的日志记录。 -
如果failure analyzer 无法处理异常,,你仍然可以显示完整的条件报告以更好地了解出错的原因。要实现这个,你需要为
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
启用debug
属性或启用DEBUG
日志 。 -
懒初始化(Lazy Initialization):
SpringApplication
允许应用程序被懒初始化。当启动懒初始化时,Bean在需要时被创建,而不是在应用程序启动时。因此,懒初始化可以减少应用程序的启动时间,在一个Web应用程序中,启动懒初始化后将导致许多与Web相关的Bean在收到HTTP请求之后才会进行初始化。缺点:会延迟发现应用程序的问题。如果一个配置错误的Bean被懒初始化了,那么在启动过程中就不会再出现故障,问题只有在Bean被初始化时才会被显现出来。此外还必须注意确保JVM有足够的内存来容纳应用程序的所有的Bean,而不仅仅是那些在启动期间菜被初始化的Bean。因此,在默认的情况下,是不启动懒初始化,建议在启动懒初始化之前,对JVM的堆大小进行调整。spring.main.lazy-initialization=true
如果想禁用某些Bean的懒初始化,同时对应用程序的其他部分使用懒初始化,可以使用
@Lazy(false)
注解将其lazy的属性显式地设置为false -
自定义“Banner”:启动时打印的Banner可以通过在classpath中添加
banner.txt
。默认情况下:直接放在resource目录下面即可自动调用。文件或者通过spring.banner.location
属性设置该文件的位置来自定义。如果文件的编码不是UTF-8,可以通过spring.banner.charset
属性设置其字符编码。配置如下:
# Banner 资源文件路径 spring.banner.location=classpath:banner/mybanner.txt
在
banner.txt
文件中,可以使用Environment
中任何的key,以及以下任何的占位符。
变量 | 介绍 |
---|---|
${application.version} | 你的应用程序的版本号,也就是 MANIFEST.MF 中声明的。 例如,Implementation-Version: 1.0 被打印为 1.0 。 |
${application.formatted-version} | 你的应用程序的版本号,如在MANIFEST.MF 中声明的那样,并以格式化显示(用括号包围,以 v 为前缀)。 例如 (v1.0) 。 |
${spring-boot.version} | 你所使用的Spring Boot版本。 例如 3.2.0-SNAPSHOT 。 |
${spring-boot.formatted-version} | 你正在使用的Spring Boot版本,格式化显示(用大括号包围并以 v 为前缀)。 例如 (v3.2.0-SNAPSHOT) 。 |
${Ansi.NAME} (或 ${AnsiColor.NAME} , ${AnsiBackground.NAME} , ${AnsiStyle.NAME} ) | 其中 NAME 是一个ANSI转义代码的名称。 详见 AnsiPropertySource 。 |
${application.title} | 你的应用程序的标题,正如在 MANIFEST.MF 中声明的那样。 例如, Implementation-Title: MyApp 被打印成 MyApp 。 |
${application.version}
和${application.formatted-version}
属性只有在你使用Spring Boot启动器时才可以用,如果你在运行一个未打包的jar,并使用java -cp <classpath> <mainclass>
启动它,这些值不会被解析。我们应该使用java org.springframework.boot.loader.JarLauncher
来启动未打包的jar。这将在构建classpath和启动你的应用程序之前初始化application.*的banner变量
5.“Builder API”:如果你需要建立一个包含层次结构的ApplicationContext
(具有父/子关系个context),可以使用SpringApplicationBuilder
其允许你链式调用多个方法如:
new SpringApplicationBuilder().sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
在创建多层的ApplicationContext
时,有一些限制,如web必须包含在子context中,且父context和子context都使用相同的environment。
6.Application 可用性:在平台上部署时,应用程序可以使用 Kubernetes Probes 等基础设施向平台提供有关其可用性的信息。Spring Boot对常用的 “liveness” 和 “readiness” 可用性状态提供了开箱即用的支持。如果你使用Spring Boot的 “actuator” ,那么这些状态将作为健康端点组(health endpoint groups)暴露出来。此外,你也可以通过将 ApplicationAvailability
接口注入到你自己的Bean中来获得可用性状态。