优点:
- 快速创建独立运行spring项目和主流框架集成
- 嵌入式servlet容器, 应用无需打成war包
- starters自动依赖与版本控制
- 大量的自动配置, 简化开发, 也可修改默认值
- 无需配置xml, 无代码生成, 开箱即用
- 准生产环境的运行时应用监控
- 与云计算的天然集成
基本要求:
- JDK 1.8
- maven
- IDEA
生成项目
在线生成Demo的网站
- Spring Initializr https://start.spring.io/
- Aliyun Java Initializr https://start.aliyun.com/
基本结构
- 启动引导Spring
ReadingListApplication在Spring Boot应用程序里有两个作用:配置和启动引导。首先,这是主要的Spring配置类。虽然Spring Boot的自动配置免除了很多Spring配置,但你还需要进行少量配置来启用自动配置。
package readinglist; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication ←---开启组件扫描和自动配置 public class ReadingListApplication { public static void main(String[] args) { SpringApplication.run(ReadingListApplication.class, args); ←---负责启动引导应用程序 } }
@SpringBootApplication
开启了Spring的组件扫描和Spring Boot的自动配置功能。实际上,@SpringBootApplication将三个有用的注解组合在了一起。
Spring的@Configuration
:标明该类使用Spring基于Java的配置。虽然本书不会写太多配置,但我们会更倾向于使用基于Java而不是XML的配置。
Spring的@ComponentScan
:启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册为Spring应用程序上下文里的Bean。本章稍后会写一个简单的Spring MVC控制器,使用@Controller进行注解,这样组件扫描才能找到它。
Spring Boot的@EnableAutoConfiguration
:这个不起眼的小注解也可以称为@Abracadabra2
,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了。
- 测试Spring Boot应用程序
Initializr还提供了一个测试类的骨架,可以基于它为你的应用程序编写测试。但ReadingListApplicationTests(代码清单2-2)不止是个用于测试的占位符,它还是一个例子,告诉你如何为Spring Boot应用程序编写测试。
package readinglist; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import readinglist.ReadingListApplication; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration( classes = ReadingListApplication.class) ←---通过Spring Boot加载上下文 @WebAppConfiguration public class ReadingListApplicationTests { @Test public void contextLoads() { ←---测试加载的上下文 } }
- 配置应用程序属性
你完全不用告诉Spring Boot为你加载application.properties
,只要它存在就会被加载,Spring和应用程序代码都能获取其中的属性。
排除依赖
在Maven里,可以用<exclusions>元素来排除传递依赖。下面这个引入Spring Boot的build.gradle的<dependency>增加了<exclusions>元素去除Jackson:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> </exclusions> </dependency>
@PathVariable
的使用
@RequestMapping(value="/{reader}", method=RequestMethod.GET) public String readersBooks( @PathVariable("reader") String reader, Model model) { ...
自动配置微调
$ java -jar readinglist-0.0.1-SNAPSHOT.jar --server.port=8000
默认情况下,Spring Boot会用Logback(http://logback.qos.ch)来记录日志,并用INFO
级别输出到控制台。
Spring Boot应用程序有多种设置途径。
Spring Boot能从多种属性源获得属性,包括如下几处。
(1) 命令行参数
(2) java:comp/env里的JNDI属性
(3) JVM系统属性
(4) 操作系统环境变量
(5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random.long})
(6) 应用程序以外的application.properties或者appliaction.yml文件
(7) 打包在应用程序内的application.properties或者appliaction.yml文件
(8) 通过@PropertySource标注的属性源
(9) 默认属性
这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。
application.properties和application.yml文件能放在以下四个位置。
(1) 外置,在相对于应用程序运行目录的/config子目录里。
(2) 外置,在应用程序运行的目录里。
(3) 内置,在config包内。
(4) 内置,在Classpath根目录。
同样,这个列表按照优先级排序。也就是说,/config子目录里的application.properties会覆盖应用程序Classpath里的application.properties中的相同属性。
此外,如果你在同一优先级位置同时有application.properties和application.yml,那么application.yml里的属性会覆盖application.properties里的属性。
Spring Boot会为错误视图提供如下错误属性
timestamp:错误发生的时间。
status:HTTP状态码。
error:错误原因。
exception:异常的类名。
message:异常消息(如果这个错误是由异常引起的)。
errors:BindingResult异常里的各种错误(如果这个错误是由异常引起的)。
trace:异常跟踪信息(如果这个错误是由异常引起的)。
path:错误发生时请求的URL路径。