Spring boot reference - part 1

本文参考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。

    原文作者:天长水远
    原文地址: https://zhuanlan.zhihu.com/p/36422041
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞