Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用程序, 大多数Spring Boot应用程序只需要很少的Spring配置。
我们的主要目标是:
- 为所有Spring开发提供一个更快,更广泛的入门体验。
- 立即开始开发。
- 提供大型项目(如嵌入式服务器,安全性,指标,运行状况检查和外部配置)通用的一系列非功能性功能。
- 绝对不会生成代码,并且不需要XML配置。
Spring Boot 2.0.0.RELEASE需要Java 8或9以及 Spring Framework 5.0.4.RELEASE或更高版本。为Maven 3.2+和Gradle 4提供了明确的构建支持。
下面开始介绍如何开发一个简单的“Hello World!”Web应用程序,该应用程序重点介绍Spring Boot的一些主要功能。我们使用Maven来构建这个项目,因为大多数IDE都支持它。
1,创建POM
以下清单显示了一个典型的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>
<! - 从Spring Boot继承默认值 - - >
<parent>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot-starter-parent </ artifactId>
<version> 2.0.0.RELEASE </ version>
</ parent>
<! - 添加Web应用程序的典型依赖关系 - >
<dependencies>
<dependency>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot-starter-web </ artifactId>
</ dependency>
</ dependencies>
<! - Package as a executable jar - >
<build>
<plugins>
<plugin>
<groupId> org.springframework.boot </ groupId>
<artifactId>spring-boot-maven-plugin </ artifactId>
</ plugin>
</ plugins>
</ build>
</ project>
2,编写代码
为了完成我们的应用程序,我们需要创建一个Java文件。默认情况下,Maven编译源代码src/main/java
,因此您需要创建该文件夹结构,然后添加一个名为src/main/java/Example.java
包含以下代码的文件:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
1.1.1 @RestController和@RequestMapping注解
我们Example类
的第一个注释是@RestController
。这被称为 stereotype annotation。它为阅读代码的人提供了线索,对于Spring来说,这个类扮演着特定的角色。在这种情况下,我们的类是一个Web @Controller
,所以Spring在处理传入的Web请求时会考虑这个类。
该@RequestMapping
注释提供“路由”的信息。它告诉Spring,任何带有/
路径的HTTP请求都应映射到该home
方法。该 @RestController
注释告诉Spring将结果字符串直接呈现给调用者。
在@RestController
与@RequestMapping
注解是Spring MVC的注解。(它们并不特定于Spring Boot。)有关更多详细信息,请参阅Spring参考手册中的MVC部分。
1.1.2 @EnableAutoConfiguration注解
第二个级别注释是@EnableAutoConfiguration
。这个注解告诉Spring Boot根据你添加的jar依赖来“猜测”你想要如何配置Spring。自从spring-boot-starter-web
添加了Tomcat和Spring MVC之后,自动配置假定您正在开发一个Web应用程序并据此设置Spring。
1.1.3“main”方法
我们应用程序的最后一部分是该main
方法。这只是一个遵循Java约定的应用程序入口点的标准方法。我们的主要方法SpringApplication
通过调用委托给Spring Boot的类run
。 SpringApplication
引导我们的应用程序,从Spring开始,然后启动自动配置的Tomcat Web服务器。我们需要Example.class
将该run
方法的参数作为参数传递,以确定SpringApplication
哪些是主要的Spring组件。还传递了args数组以传递命令行参数。
1.1.4 创建可执行的jar
让我们完成我们的例子,创建一个完全自包含的可执行jar文件,我们可以在生产环境中运行。 可执行的jar(有时称为“fat jars”)是包含编译的类以及代码运行所需要的所有jar包依赖的归档(archives)。
可执行jar和Java
Java不提供任何标准的方法来加载嵌套的jar文件(即本身包含在jar中的jar文件)。 如果您正在寻找可以发布自包含的应用程序,这可能是有问题的。
为了解决这个问题,许多开发人员使用“uber” jars。 一个uber jar简单地将所有类、jar包进行档案。 这种方法的问题是,很难看到您在应用程序中实际使用哪些库。 如果在多个jar中使用相同的文件名(但具有不同的内容),也可能会出现问题。
Spring Boot采用一个不同的方法这样可以直接对jar进行嵌套。
要创建可执行的jar,我们需要将spring-boot-maven-plugin添加到我们的pom.xml中。 在 dependencies标签 下方插入以下行:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2,配置类的使用
2.1. 配置类
Spring Boot提倡基于Java的配置。尽管你可以使用XML源调用SpringApplication.run()
,不过还是建议你使用@Configuration
类作为主要配置源。通常定义了main
方法的类也是使用@Configuration
注解的一个很好的替补。
注:虽然网络上有很多使用XML配置的Spring示例,但你应该尽可能的使用基于Java的配置,搜索查看enable*
注解就是一个好的开端。
2.2导入其他配置类
你不需要把所有的@Configuration
东西都放到一个班上。该@Import
注释可用于导入其他配置类。或者,您可以使用 @ComponentScan
自动获取所有Spring组件,包括@Configuration
类。
2.3导入XML配置
你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。简单起见,我们经常使用@ComponentScan
注解搜索beans,并结合@Autowired
构造器注入。
如果遵循以上的建议组织代码结构(将应用的main类放到包的最上层,即root package),那么你就可以添加@ComponentScan
注解而不需要任何参数,所有应用组件(@Component
, @Service
, @Repository
, @Controller
等)都会自动注册成Spring Beans。
下面是一个@Service
Bean的示例,它使用构建器注入获取一个需要的RiskAssessor
bean。
如果你绝对必须使用基于XML的配置,我们建议你仍然从一个@Configuration
类开始。然后您可以使用@ImportResource
注释来加载XML配置文件。
3,Spring Beans和依赖注入
你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。简单起见,我们经常使用@ComponentScan
注解搜索beans,并结合@Autowired
构造器注入。
如果遵循以上的建议组织代码结构(将应用的main类放到包的最上层,即root package),那么你就可以添加@ComponentScan
注解而不需要任何参数,所有应用组件(@Component
, @Service
, @Repository
, @Controller
等)都会自动注册成Spring Beans。
下面是一个@Service
Bean的示例,它使用构建器注入获取一个需要的RiskAssessor
bean。
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
如果一个bean有一个构造函数,则可以省略@Autowired
,如以下示例所示:
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
注 注意使用构建器注入允许riskAssessor
字段被标记为final
,这意味着riskAssessor
后续是不能改变的。
3,使用@SpringBootApplication注释
很多Spring Boot开发者经常使用@Configuration
,@EnableAutoConfiguration
,@ComponentScan
注解他们的main类,由于这些注解如此频繁地一块使用(特别是遵循以上最佳实践的时候),Spring Boot就提供了一个方便的@SpringBootApplication
注解作为代替。
@SpringBootApplication
注解等价于以默认属性使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
注 @SpringBootApplication
注解也提供了用于自定义@EnableAutoConfiguration
和@ComponentScan
属性的别名(aliases)。这些功能都不是强制性的,您可以选择使用它启用的任何功能替换此单个注释。例如,您可能不想在应用程序中使用组件扫描:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}