一、 读后感
Spring Boot在技术圈火了好多年了,直到最近才去系统学习它,真是相见恨晚。当我在IDE编写几行代码就把WEB应用启动,页面访访问出来hello world的时候,我惊讶的感叹Spring构建WEB应用竟如此简单。
Spring Boot起源于2014年,是为简化Spring项目中复杂难记的配置而生。回顾Spring开发历程,我们定义bean以及依赖关系大概经历这样两个阶段:
- 在配置文件中定义。
- 使用注解定义。
虽然使用注解后我们写配置文件的工作量减少了很多,但是还是得在配置文件中编写一系列jar依赖,当实现一个功能时可能要引入多个依赖,而这些依赖关系我们难以记得住,更难以搞得清楚。我觉得以前的Spring开发还有两个比较明显的痛点:
- 配置文件中的jar依赖较多,且依赖关系复杂。
- 属性配置值不规范,不方便读取配置值。
Spring Boot最基本作用就是解决以上痛点,但是其集成的功能远超过这些。Convention over configuration(约定优于配置)一句话可以简单概述Spring Boot的基本功能,其起步依赖、自动配置已经约定的属性值可以把以上两个痛点处理得相当棒。
另外,Spring Boot自带的端点度量功能可以让我们更了解应用的运行状况。其提供的快速测试和部署方法提高了我们的工作效率。
不得不承认,国外大牛写的这本书确实容易理解,是一本很好的入门书籍,接下来是我对本书的一些技术总结。
二、启动第一个Spring Boot项目
只要三步就可以构建一个Spring Web应用
1. 使用Spring Initializr初始化Spring Boot项目
这一步创建Spring Boot脚手架,方式有好几种,包括:通过Spring 官网Web界面创建、Spring Tool Suite创建、IDEA等。我就直接使用IDEA创建,效果如下:
这里java、和test目录定义跟以前一样。resources下面放应用的资源,static放页面静态文件,比如css,html文件。templates下面放模板文件,比如Velocity,Thymeleaf等。application.properties默认属性文件,只要放里面写key value对,应用就可以读取到。
2.生成依赖文件,可以用gradle,maven,我是用maven。只要加入一个web的依赖,一个maven的插件
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin
3. 写代码
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ControllerDemo { @RequestMapping("/") public String index(){ return "hello springboot"; }}package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ReadlistApplication { public static void main(String[] args) { SpringApplication.run(ReadlistApplication.class, args); }}
然后在IDEA启动应用,一个web应用就起来了。默认插件服务器是tomcat,端口是8080.从中我们可以看到依赖是多么的简洁,只要一个约定好的起步依赖就好了。
其中启动引导注解:@SpringBootApplication,其包含三部分
- @Configuration。作用是告诉spring用基于java的配置,即java config
- @ComponentScan。开启组件扫描
- @EnableAutoConfiguration。开启自动配置,自动配置bean依赖的jar(自动配置是通过@Conditional 去关联的,条件满足就注入相关的依赖,步步关联jar)
三、配置的设置方式
- 命令行参数
- java:comp/env里的JNDI属性配置文件
- JVM系统属性
- 操作系统环境变量
- random.*前缀属性
- 应用程序以外的 application.properties,.application.yml文件
- 打包在应用程序内的 application.properties,.application.yml文件
- 通过PropertySource标注的属性源
- 默认属性
优先级从高到低,1优先级最高,高优先级的可以覆盖低优先级的属性值。
另外 两个默认加载的两个文件(application.properties,.application.yml)能放在以下四个位置,优先级从高到低
- 外置,在相对于应用程序运行目录的 /config 目录下
- 外置,在应用程序运行目录下
- 内置,classpath的/config目录下
- 内置,classpath目录下
其它名称的属性文件,比如xx.properties文件,也可以放到以上四个位置加载,优先级一样,但是需要用到@PropertySource("xx")加载,比如@PropertySource("classpath:aa.properties"),这个注解不能加载yml文件
xml文件需要使用@ImportResource加载
同一优先级同时有application.properties,.application.yml,那么application.yml的优先级更高
有两种方式引用属性值: @ConfigurationProperties("prefix")和@Value("key")
四、端点度量
访问地址:
spring boot 2.x 以上默认只加载了 info / health 其他端点需要在配置文件中开启: management.endpoints.web.exposure.include=*
各端点功能如下: beans:看到依赖 conditions:自动配置报告,依赖的匹配条件 env:查看属性值,password、secret、key的值会*号屏蔽显示。后面加属性key可以查看单个属性值,例如env/server.port mapping:查看映射 metrics:度量信息。运行时数据 trace:跟踪web请求,查看请求头信息 dump:线程活动 health:服务的健康状态,健康指示器
shutdown:关闭运行中的应用程序,默认关闭 management.endpoint.shutdown.enabled=ture开启
除了REST获取端点信息,端点可以用shell,MBean查看端点信息
可以定制actuator,返回需要的健康信息, 也可以改变端点的id,启用或者禁用端点 management.context-path=/actuator 设置端点的根目录,2.x以上似乎已经加上了/actuator
五、单元测试
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ReadlistApplication.class)@WebAppConfigurationpublic class ReadlistApplicationTests { @Test public void contextLoads() { }}
@RunWith(SpringJUnit4ClassRunner.class):引入Spring对JUnit4的支持。 @SpringBootTest(classes = ReadlistApplication.class):加载应用程序上下文。 @WebAppConfiguration:开启WEB应用的配置,用于模拟ServletContext。