一、SpringBoot概述
1、什么是SpringBoot?
Spring作为一个轻量级的容器,在javaEE开发中得到了广泛的应用,但是Spring的配置繁琐臃肿,在和各种第三方框架进行整合时代码量非常庞大,并且整合的代码大多是重复的,为了使开发者能够快速上手Spring,利用Spring框架快速搭建javaEE项目,SpringBoot应运而生。
SpringBoot带来了全新的自动化配置解决方案,使用SpringBoot可以快速创建基于Spring生产级的独立应用程序。SpringBoot中对一些常用的第三方库提供了默认的自动化配置方案,使得开发者只需要很少的Spring配置就能运行一个完整的javaEE应用。SpringBoot项目可以采用传统的方案打成war包,然后部署到Tomcat中运行,也可以直接打成可执行jar包,这样通过java -jar命令就可以启动一个SpringBoot项目。
2、SpringBoot的核心功能
(1)独立运行的 spring 项目: Spring Boot 可以以 jar 包形式直接运行,如 java -jar xxx.jar 优点是:节省服务器资源 (2)内嵌 servlet 容器: Spring Boot 可以选择内嵌 Tomcat,Jetty,这样我们无须以 war 包形式部署项目。 (3)提供 starter 简化 Maven 配置: 在 Spring Boot 项目中为我们提供了很多的 spring-boot-starter-xxx 的项目(我们把这个依赖可以称之为起步依赖,我们导入指定的这些项目的坐标,就会自动导入和该模块相关的依赖包:例如我们后期再使用 Spring Boot 进行 web 开发我们就需要导入 spring-boot-starter-web 这个项目的依赖,导入这个依赖以后!那么Spring Boot 就会自动导入 web 开发所需要的其他的依赖包。
(4)自动配置 spring: Spring Boot 会根据在类路径中的 jar 包,类,为 jar 包里的类自动配置 Bean,这样会极大减少我们要使用的配置。当然 Spring Boot 只考虑了大部分开发场景,并不是所有的场景,如果在实际的开发中我们需要自动配置 Bean,而 Spring Boot 不能满足,则可以自定义自动配置。 (5)准生产的应用监控: Spring Boot 提供基于 http,ssh,telnet 对运行时的项目进行监控。 (6)无代码生成和 xml 配置: Spring Boot 大量使用 spring4.x 提供的注解新特性来实现无代码生成和 xml 配置。spring4.x 提倡使用 Java配置和注解配置组合,而 Spring Boot 不需要任何 xml 配置即可实现 spring 的所有配置。
3、SpringBoot的优点
优点 (1)快速构建项目 (2)对主流框架无缝集成 (3)项目可以独立运行,无需依赖外部 servlet 容器 (4)提供运行时的应用监控 (5)极大提高了开发,部署效率
二、SpringBoot入门案例
1、新建SpringBoot项目
点击下一步:
2、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--项目信息-->
<groupId>com.kkb</groupId>
<artifactId>springbootdemo01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootdemo01</name>
<description>Demo project for Spring Boot</description>
<!--java的版本-->
<properties>
<java.version>11</java.version>
</properties>
<!--依赖管理-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、开发controller
注意:Controller的包一定在当前包的子包下
示例图:
代码:
@RestController
public class HelloController {
@GetMapping("/hello")
public String method(){
return "SpringBoot 你好 我爱你";
}
}
代码解释:
@RestController相当于@@ResponseBody和@Controller
运行结果图:
三、SpringBoot基本配置
1、spring-boot-starter-parent
1.1 spring-boot-starter-parent
SpringBoot提供了一个名为spring-boot-starter-parent的构件,里面已经对各种常用依赖(并非全部)的版本进 行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
直接使用spring-boot-starter-parent很方便,但是在公司里如果使用自己的parent如果此时还需要依赖版本统一管理,就需要使用dependencyManagement来实现。添加到pom.xml文件中
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
java版本、编码格式等都需要开发者手动配置。java版本的配置很简单,添加一个plugin即可:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
编码格式,如果使用maven创建SpringBoot项目,需要在pom.xml文件中添加如下配置:
<properties>
<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
</properties>
1.2 @SpringBootApplication
主程序:
@SpringBootApplication // 来标注一个主程序类,说明这是一个springboot应用
public class Springbootdemo01Application {
public static void main(String[] args) {
// spring应用启动起来
SpringApplication.run(Springbootdemo01Application.class, args);
}
}
先来看一下@SpringBootApplication注解,现在来看一下源码
点击@SpringBootConfiguration进入
@SpringBootConfiguration其实就是一个@Configuration,所以功能为表明这是一个配置类,开发者可以在这个类中配置Bean。从这个角度来看,这个类扮演的角色类似于Spring中的applicationContext.xml文件的角色
@EnableAutoConfiguration表示开启自动化配置。SpringBoot中的自动化配置是非侵入式的,在任意时刻,开发者都可以使用自定义配置代替自动化配置中的某一个位置
@ComponentScan完成包扫描,也是Spring中的功能,由于@ComponentScan注解默认扫描的类都位于当前类所在包的下面,因此建议在实际项目开发中把项目启动类放在根包下
项目启动类中的ComponentScan注解,除了扫描@Service,@Repository,@Component,@Controller和RestController等之外,也会扫描@Configuration注解的类
可以自己写一个类加上@Configuration注解
2、启动图案banner
编写banner.txt放入resources文件夹下, 然后启动项目即可修改默认图案
提供编写banner生成的网址:
https://www.bootschool.net/ascii
3、Properties配置
SpringBoot中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources目录下的application.properties文件(可以使用YAML文件替换)
SpringBoot项目中的application.properties配置文件移动可以出现在如下4个位置:
-
项目根目录下的config文件夹中
-
项目根目录下
-
classpath下的config文件夹中
-
classpath下
如果这四个位置都有application.properties文件,那么加载的优先级从1到4依次降低,SpringBoot按照这个优先级查找配置信息,加载到SpringEnvironment中
4、类型安全配置属性
现在我们已经了解到无论是Properties配置还是YAML配置,最终都会被加载到SpringEnvironment中,Spring提供了@Value注解以及Environment Aware接口来将SpringEnvironment中的数据注入到属性上,SpringBoot对此进一步提出了类型安全配置属性,这样即使在数据量非常庞大的情况下,也可以方便的将配置文件中的数据注入到Bean中,如下所示:
将以上配置数据注入如下Bean中:
需要添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
代码解释:
-
@ConfigurationProperties中的prefix属性描述了要加载的配置文件的前缀
-
如果配置文件是一个YAML文件,那么可以将数据注入一个集合中。
-
SpringBoot采用了一种宽松的规则来进行属性绑定,如果Bean中的属性名为authorName,那么配置文件中的属性可以是book.author_name、book.author-name、book.authorName或者book.AUTHORNAME
注意:以上配置可能会出现乱码,需要对中文进行转码,如下图所示:
创建BookController进行简单测试:
运行结果图:
5、YAML配置
5.1 常规配置
YAML是JSON的超集,简洁而强大,是一种专门用来书写配置文件的语言,可以替代application.properties。在创建一个SpringBoot项目时,引入的spring-boot-starter-web依赖间接地引入了snakeyaml依赖,snakeyaml会实现对yaml配置的解析。YAML的使用非常简单,利用缩进来表示层级关系,并且大小写敏感。在SpringBoot项目中使用YAML只需要在resources目录下创建一个application.yaml文件即可,然后进行配置:
server:
port: 80
servlet:
context-path: /book
tomcat:
uri-encoding: utf-8
以上配置等于application.properties中的如下配置:
server.port=80
server.servlet.context-path=/book
server.tomcat.uri-encoding-utf-8
此时可以将resources目录下的application.properties文件删除,完全使用YAML完成文件的配置
5.2 复杂配置
YAML不仅可以配置常规配置,也可以配置复杂属性,例如下面一组配置:
my:
name: ajian
address: China
新建实体类User:
@Component
@ConfigurationProperties(prefix = "my")
public class User {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
在Controller类中进行测试:
@RestController
public class BookController {
@Autowired
public Book book;
@Autowired
User user;
@GetMapping("/book")
public String bookMethod() {
return book.toString();
}
@GetMapping("/user")
public String UserMethod(){
return user.toString();
}
}
运行结果图: