1.1 Spring Boot思想
Spring Boot是所有基于Spring开发项目的起点。Spring Boot的设计目的是为了让我们快速的启动一个Spring应用程序并且减少配置工作。
Spring Boot的核心思想是:约定由于配置(Convention over Configuration),和MVC三层架构一样是一种软件设计范式。
约定由于配置从本质来说,就是系统、框架等需要配置的项都要有合适的默认值,而不应该让使用者提供这些不必配置。例如:
-
MySQL数据库应该提供默认端口,而不应该让使用者指定,MySQL默认端口是3306。
-
Tomcat应用服务器提供默认的访问端口,Tomcat默认端口是8080。
-
开发中团队约定所有的数据库表都用
t_
为前缀。以上这些都是约定,约定提供了配置项的默认值,如果不修改就使用默认值。当需要修改的时候,就是使用者配置的项。
1.2 Spring Boot为何诞生
任何的框架都不会无缘无故诞生,框架的诞生都是需求的具体表现。所以Spring Boot也不是随便就诞生了,它的出现可以说是技术发展到一定阶段必然的产物。
1.2.1 Spring分析
优点:
- 替代了JavaEE框架,提供了轻量级的开发方式。
- 解决了EJB企业级开发框架的重配置和重资源问题。提供了IOC和AOP编程思想。
缺点:
- Spring 的组件划分的非常细使用轻,需要的资源少。但是Spring的配置比较繁琐,很多功能都需要一大堆的XML配置才可以完成引入。虽然后续的发展Spring 引入了注解、Java API配置功能,减少了很多的配置,但是Spring整合其他框架的时候配置还是非常的多的。
- Spring整合其他框架的时候如何解决Maven依赖的问题也非常浪费时间。需要分析某一个技术、框架需要引入那些Jar包。版本引入错误还要解决冲突的问题。
1.2.2 Spring Boot的核心
基于上诉Spring框架的缺点问题,Spring Boot基于约定由于配置的思想诞生了。
自动依赖
自动依赖其实就是一个Maven项目对象模型,定义了其他类库的依赖传递,并且添加了一些功能。将某个框架/技术需要的Jar打包到一起,只需要引入一个就可以引入所有,并且解决了版本冲突问题
自动装配
自动装配也叫做自动配置,自动配置可以从两个方向去理解。
- Bean的自动注册到IOC容器
- 引入的功能不需要额外的配置,都会基于默认值给我们配置好
1.3 Spring Boot快速体验
需求: 通过URL访问Controller,返回Hello World
注意: Spring Boot的构建是需要连接服务器的,默认情况都是使用https://start.spring.io服务器。如果网络连接有问题可以访问阿里巴巴提供的构建网站 https://start.aliyun.com/bootstrap.html
-
使用IDEA提供的Spring Initializr构建Spring Boot项目
Spring Initializr提供了一个构建应用的平台,只需要在上面选择项目的技术即可,Spring Initializr会自动根据Spring Boot的版本选择合适的框架版本依赖。可以快速帮助我们构建一个应用。
项目基础的信息完成选择后,需要等待构建以及项目下载,所以需要一定的时间。
Spring Boot项目创建好以后,项目目录结构如下:
创建支持Web方式访问的DemoController
@RestController
public class DemoController {
@GetMapping("/demo/sayHello")
public String sayHello() {
return "Hello World";
}
}
启动项目
Spring Boot默认端口是8080(因为内嵌了tomcat服务器),项目启动完成后,访问Controller方法http://localhost:8080/demo/sayHello
页面正常输出了Hello World,这样简单的几步就可以基于Spring Boot构建一个Web应用并启动。
对单元测试的支持
Spring Boot项目构建以后,再test文件夹下会生成一个测试类。可以模拟到Spring Boot项目启动的过程,对于需要的资源会自动加载。例如:配置文件信息加载、bean实例的创建并交给spring ioc容器等。
@SpringBootTest // 标注是一个测试Spring Boot,启动时候会初始化资源
class DemoApplicationTests {
@Autowired // 注入Controller
private DemoController demoController;
@Test
public void tset() {
// 调用sayHello方法
String sayHello = demoController.sayHello();
// 结果输出到控制台
System.out.println(sayHello);
}
}
1.4 Spring Boot热部署
默认情况下,Spring Boot每次修改代码后不会立即生效,需要重启服务才可以。如果频繁的执行修改特别是页面样式的修改等,非常浪费时间。因此,Spring Boot框架为我们提供了热部署这样一个机制,从而实现项目的重启无需人工干预,可以自动完成。默认是没有热部署的,需要配置生效才可以
热部署配置步骤
- 引入热部署依赖启动器Jar
- IDEA配置支持热部署功能
添加热部署依赖启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
配置IDEA工具热部署设置
菜单:File -> Settings 然后如下配置 选择OK生效即可。
在项目中使用快捷键:Ctrl+Shift+Alt+/打开页面,选择Registry
经过上诉的2个步骤配置,热部署功能就生效了。我们可以启动项目,访问页面http://localhost:8080/demo/sayHello 返回的值为Hello World。然后修改返回值为:Hello Java。刷新浏览器就可以看到最新的结果。
热部署原理
热部署的实现原理就是当我们的应用修改后,IDEA自动重启应用而不用人工手动执行。
1.5 配置文件
在Spring Boot构建的项目中,不需要任何配置都可以启动,这是由于Spring Boot对于各种框架属性配置都有默认的值。当然Spring Boot也支持属性自定义,例如:在刚才的项目中修改启动端口为9090。
在构建完成的Spring Boot项目resources下有个application.properties配置文件,可以在此配置信息。Spring Boot的配置文件支持2种格式properties
或者yaml(yml)
。两种格式参数都是一样,只是书写格式有变化。
# 指定启动端口为9090
server.port=9090
# 项目重启后可以看到Tomcat的端口修改为了9090
2020-09-26 21:02:38.988 INFO 2328 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9090 (http) with context path ''
1.5.1 application.properties配置文件
application.properties配置文件的格式为:a.b.c=值。
server.port=9090
spring.application.name=spring-boot-demo
1.5.1.1 application.properties自定义配置信息
普通属性注入
person.name=jack
person.age=18
定义注入的Bean
// 先定义实体
@Component // person类将交由spring创建实例
// 引入配置文件,并且指定前缀,这样就会在配置文件中找person前缀的属性
@ConfigurationProperties(prefix = "person")
public class Person {
// 注入配置文件的person.name属性
private String name;
// 注入配置文件的person.age属性
private String age;
// getter/setter
}
修改DemoController
@RestController
public class DemoController {
// 注入Person类
@Autowired
private Person person;
// 返回person,看里面的值是不是配置文件的
@GetMapping("/demo/properties")
public Object properties() {
return person;
}
}
到目前为止,我们已经完成了Spring Boot项目的默认属性配置修改(server.port),和自定义配置信息(person)的注入功能。这些都是简单的功能注入,接下来我们将介绍复杂的配置属性注入。
List/数组注入
对于集合或者数组类型的配置,多个值之间使用逗号隔开
# 集合配置
person.hobby=学习,睡觉,做饭
# 数组配置
person.family=father,mother
Person添加属性
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private String age;
private List hobby;
private String[] family;
// getter setter
}
Map注入
Map是键值对格式的数据,如:key1=value1,key2=value2。在properties配置文件也是类似的。
# Map配置
person.map.key1=value1
person.map.key2=value2
Person添加属性
package com.example.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* Author: zhi chun qiu
* date: 2020/9/26 21:15
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private String age;
private List hobby;
private String[] family;
private Map map;
// getter setter
}
对象注入
下面将介绍如果将配置文件的值注入到实体内部的Bean中。其实经过上面的Map和List对象的注入,可以猜到对象注入和Map等都是类似的。
# Bean注入
person.pet.type=cat
person.pet.name=big-eat
定义一个Pet对象
public class Pet {
private String type;
private String name;
// getter setter
}
在Person中引入Pet
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private String age;
private List hobby;
private String[] family;
private Map map;
private Pet pet;
}
1.5.2 application.yaml配置文件
Yaml文件格式是Spring Boot支持的一种类式JSON的超集文件格式,相比较与properties配置文件,Yaml配置文件关注数据,使用更加简洁。
- Yaml文件的扩展名可以是yaml或者yml
- application.yml文件格式为key: value。yaml则使用缩进控制层级关系
格式演示
server:
port: 9090
集合/数组注入格式
# 格式一
person:
hobby:
- play
- study
- sleep
# 格式二
person:
hobby:
play,
study
sleep
# 格式三
person:
hobby: [play,study,sleep]
Map注入格式
# 格式一
person:
map:
key1: value1
key2: value2
# 格式二
person:
map: {key1: value1, key2: value2}
对象注入格式
person:
pet: {type: cat, name: big-eat}
1.6 配置文件属性注入
# 统一配置文件,下面的注入方式都基于这个配置文件值注入,这里展示基础属性注入
person.name=jack
person.age=18
1.6.1 @ConfigurationProperties方式
@ConfigurationProperties方式注入配置文件属性,是基于Java Bean的。这样可以实现批量注入并且在需要的地方引入对象即可使用。
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private String age;
// getter setter
}
1.6.2 @Value方式
@Value是Spring提供的注解,这种读取配置文件的方式是在需要使用的地方单独注入。当然也可以统一注入到某个Java Bean,在需要使用的地方引入对象即可。
@Component
public class Person {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private String age;
}
Spring Boot学习思维导图