本文参考Spring boot reference .
Spring boot 2.1.0.BUILD-SNAPSHOT 需要java8或java9. 支持下列嵌入式servlet containers: Tomcat 8.5, Jetty 9.4, Undertow 1.4.
Spring boot可以借助于classic java开发工具使用,也可以以命令行工具的形式安装。Spring boot可以像任何标准java library一样使用,但还是建议使用build tool(maven or gradle)来支持依赖管理。
–Use Maven to build
通常,程序的maven pom file继承自spring-boot-starter-parent项目并可以声明对其它starters的依赖。Spring boot也提供optional的maven plugin来创建可执行的jar包。
使用maven对应的pom.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- Add Spring repositories -->
<!-- (you don't need this if you are using a .RELEASE version) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
–Use Gradle to build
Spring boot提供了Gradle plugin来简化依赖声明并创建可执行jar包。下面是典型的build.gradle文件。
buildscript {
repositories {
jcenter()
maven { url 'https://repo.spring.io/snapshot' }
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.1.0.BUILD-SNAPSHOT'
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
jar {
baseName = 'myproject'
version = '0.0.1-SNAPSHOT'
}
repositories {
jcenter()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
–Spring Boot CLI
Spring boot CLI是命令行工具,可以用来快速生成spring project。运行Groovy脚本来执行。创建app.groovy如下并运行。
@RestController
class ThisWillActuallyRun{
@RequestMapping("/")
String home(){
"Hello World!"
}
}
运行如下:
$ spring run app.groovy
–Simple example
spring-boot-starter-parent 提供useful maven defaults并提供dependency management section,所以我们可以省略依赖中的version。其它的starter提供其它依赖当我们开发特定类型的应用程序。
@EnableAutoConfigutation使得spring boot依据添加的jar dependency来自动配制spring。例如spring-boot-starter-web添加tomcat和spring MVC, auto-configuration假设我们在开发web application并相应的设置spring。
main方法中调用SpringApplication类中的run方法并传入Example.class作为参数来告诉SpringApplication哪个是primary spring component。SpringApplication启动app和spring,然后启动自动配制的tomcat web server。
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
为了能生成可执行jar包,我们需要添加spring-boot-maven-plugin如下。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
推荐使用支持dependency management的build system,可以使用发布到maven central repository的artifact。最好使用maven和gradle,当然也可以使用其它build system如Ant,但支持不好。
每个版本的spring boot提供一个他支持的dependencies list,所以不需要提供依赖的version,而且当upgrade spring boot时,相应的dependency会自动升级。当然,我们也可以指定特定的version。
–Spring boot parent
通过继承spring-boot-starter-parent项目可以获得一些实用的default值,如:java 8作为默认的编译器level;UTF-8编码;继承自spring-boot-dependencies pom的dependency management section,其中管理common dependencies的version,这样我们就可以在自己的pom文件中省略version;实用的resource filtering; 实用的插件配制;实用的resource filtering for application.properties。
但并不是所有人都喜欢继承spring-boot-starter-parent pom,可以使用自己的parent或显式声明所有的maven configuration。在不继承parent的情况下也可以通过使用scope=import来使用dependency management,如下。
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
spring boot使用maven plugin来将project打包成可执行jar包,如下使用。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
也有可能使用Apache Ant + Ivy来build spring boot project。spring-boot-antlib会帮助ant来创建可执行jar包。
–Starters
Starters are a set of convenient dependency descriptors that you can include in your application.
starter中包含能让程序快速跑起来的依赖。
Spring Boot favors Java-based configuration. 我们不用将所有的@Configuration放在同一个class中,可以使用@Import来导入其它的配制类。另外,也可以使用@ComponentScan来自动pick up所有的spring component。如果必须使用XML-based configuration,建议还是start with @Configuration 类并使用@ImportResource来加载XML配制文件。
–Auto-configuration
spring boot auto-configuration试图根据我们添加的jar dependencies来自动配制spring application。必须在configuration class中使用@EnableAutoConfiguration或@SpringBootApplication来引入自动配制。
auto-configuration是非侵入式的,当我们定义自己的configuration,默认添加的就会被覆盖。当不需要自动配置中的特定类时,可以使用@EnableAutoConfiguration的exclude属性来disable。也可以使用spring.autoconfigure.exclude property来去除class。
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration{
}
–@SpringBootApplication
@SpringBootApplication等价于使用@Configuration, @EnableAutoConfiguration, @ComponentScan并使用其默认值。
可执行jar包可以用来production deployment,也适用于cloud-based deployment。
–SpringApplication class
SpringApplication类提供一种方便的方式来启动具有main()的spring application。大部分情况下,你可以调用静态函数SpringApplication.run()来启动程序。当程序启动失败,FailureAnalyzers会分析失败原因并给出解决办法。
当SpringApplication当默认设置不适用时,可以创建local instance并配制它。
public static void main(String[] args){
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner,Mode.OFF);
app.run(args );
}
传递给SpringApplicaton的参数是spring bean的configuration source。
SpringApplication试图代表用户去创建正确的ApplicationContext类型,确定WebEnvironmentType的算法非常简单,若Spring MVC出现,则使用AnnotationConfigServletWebServerApplicationContext; 否则若Spring WebFlux出现,使用AnnotationConfigReactiveWebApplicationContext;否则使用AnnotationConfigApplicationContext. 即当spring MVC和Spring WebFlux同时出现在程序中,会默认使用Spring MVC. 可以通过调用setWebApplicationType(WebApplicationType)来修改。
–ApplicationRunner or CommandLineRunner
在SpringApplication启动后需要执行一些特定的code时,我们可以实现ApplicationRunner或CommandLineRunner接口。这2个接口都提供run()方法,该方法将在SpringApplication.run()函数结束之前被调用。
@Component
public class MyBean implements CommandLineRunner{
public void run(String... args){
//Do something... }
}
当定义了多个runner时,可以实现接口Ordered或Order来指定顺序。
–Application Exit
每个SpringApplication在JVM中注册shutdown hook来保证在程序退出时,ApplicationContext能够优雅的关掉。如果当SpringApplication.exit()被调用室能够返回指定的exit code,bean需要实现org.springframework.boot.ExitCodeGenerator接口。
通过指定spring.application.admin.enabled property,我们能够启动admin-related feature。