SpringBoot超详细总结

SpringBoot简介

什么是SpringBoot?

随着动态语言的流行(Ruby、Groovy、Scala、Node、Js), Java的开发显得格外的笨重:配置繁杂,开发效率低,在广泛复杂的部署过程中,与第三方技术集成困难。
在这种情况下,SpringBoot应运而生。它使用了“习惯重于配置”(在项目中有大量的配置,除了内置的习惯性配置之外,让您不需要手动配置)的理念,使您的项目快速启动和运行。使用SpringBoot很容易创建一个独立的运行(运行jar,嵌入式Servlet容器),准生产级别的基于Spring框架的项目,使用SpringBoot您可以不需要或只需要很少的Spring配置。
Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。
我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。

SpringBoot的特点

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。

快速入门

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SpringBoot的核心

入口类和@SpringBootApplication注解

Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。

@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:
在这里插入图片描述
这里重点的注解有3个:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootConfiguration

我们继续点击查看源码:
在这里插入图片描述
通过这段我们可以看出,在这个注解上面,又有一个@Configuration注解。通过上面的注释阅读我们知道:这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration的类,并且读取其中的配置信息。而@SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。

@EnableAutoConfiguration

SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。
所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配置就可以交给SpringBoot处理了。除非你不希望使用SpringBoot的默认配置,它也提供了自定义配置的入口。

@ComponentScan

在这里插入图片描述
配置组件扫描的指令。提供了类似与<context:component-scan>标签的作用

通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包

而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中。

关闭自动配置

通过上述,我们得知,Spring Boot会根据项目中的jar包依赖,自动做出配置,Spring Boot支持的自动配置如下(非常多):
在这里插入图片描述
如果我们不需要Spring Boot自动配置,想关闭某一项的自动配置,该如何设置呢?
比如:我们不想自动配置Redis,想手动配置。
在这里插入图片描述

自定义Banner

启动Spring Boot项目后会看到这样的图案:
在这里插入图片描述
这个图片其实是可以自定义的:
1:创建文本文件,并且将该文件命名为banner.txt
2.将banner.txt拷贝到项目的resources目录中:
3.重新启动程序,查看效果:
在这里插入图片描述
推荐Banner的两个网址:
https://www.bootschool.net/ascii-art;bsid=40D9C21959E6D5EA4B04CCC0369A1629
https://www.bootschool.net/ascii
如果不想看到任何的banner,也是可以将其关闭的:
在这里插入图片描述

全局配置文件

Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到resources下。
1.修改tomcat的端口为8088
在这里插入图片描述
2.设置应用程序上下文
在这里插入图片描述

访问静态资源

现在,我们的项目是一个jar工程,那么就没有webapp,我们的静态资源该放哪里呢?
回顾我们上面看的源码,有一个叫做ResourceProperties的类,里面就定义了静态资源的默认查找路径:
默认的静态资源路径为:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public
    只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。
    我们习惯会把静态资源放在classpath:/static/目录下。

SpringBoot整合连接池

其实,在刚才引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池:
在这里插入图片描述
因此,我们只需要指定连接池参数即可:

# 连接四大参数
spring.datasource.url=jdbc:mysql://localhost:3306/dms
spring.datasource.username=root
spring.datasource.password=root
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10

当然,如果你更喜欢Druid连接池,也可以使用Druid官方提供的启动器:

<!-- Druid连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>

而连接信息的配置与上面是类似的,只不过在连接池特有属性上,方式略有不同:

#初始化连接数
spring.datasource.druid.initial-size=1
#最小空闲连接
spring.datasource.druid.min-idle=1
#最大活动连接
spring.datasource.druid.max-active=20
#获取连接时测试是否可用
spring.datasource.druid.test-on-borrow=true
#监控页面启动
spring.datasource.druid.stat-view-servlet.allow=true

Springboot整合mybatis

<!--mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

配置,基本没有需要配置的:

# mybatis 别名扫描
mybatis.type-aliases-package=com.lxw.pojo
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml

需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加@Mapper注解,才能被识别。

@Mapper
public interface UserMapper {
    
    
}

SpringBoot整合Thymeleaf

SpringBoot并不推荐使用jsp,但是支持一些模板引擎技术:
在这里插入图片描述

提供数据

编写一个controller方法,返回一些用户数据,放入模型中,将来在页面渲染

@GetMapping("/all")
public String all(ModelMap model) {
    
    
    // 查询用户
    List<User> users = this.userService.queryAll();
    // 放入模型
    model.addAttribute("users", users);
    // 返回模板名称(就是classpath:/templates/目录下的html文件名)
    return "users";
}

引入启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

静态页面

根据上面的文档介绍,模板默认放在classpath下的templates文件夹,我们新建一个html文件放入其中:
编写html模板,渲染模型中的数据:
注意,把html 的名称空间,改成:xmlns:th=“http://www.thymeleaf.org” 会有语法提示

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style type="text/css">
        table {
     
     border-collapse: collapse; font-size: 14px; width: 80%; margin: auto}
        table, th, td {
     
     border: 1px solid darkslategray;padding: 10px}
    </style>
</head>
<body>
<div style="text-align: center">
    <span style="color: darkslategray; font-size: 30px">欢迎光临!</span>
    <hr/>
    <table class="list">
        <tr>
            <th>id</th>
            <th>姓名</th>
            <th>用户名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>生日</th>
        </tr>
        <tr th:each="user : ${users}">
            <td th:text="${user.id}">1</td>
            <td th:text="${user.name}">张三</td>
            <td th:text="${user.userName}">zhangsan</td>
            <td th:text="${user.age}">20</td>
            <td th:text="${user.sex}"></td>
            <td th:text="${user.birthday}">1980-02-30</td>
        </tr>
    </table>
</div>
</body>
</html>

测试

在这里插入图片描述

SpringBoot集成Swagger

Swagger是什么?

Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

添加jar

<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.0</version>
 </dependency>

配置

package com.example.demo.tools;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
 * @author yxm
 * @date 2021/3/1
 */

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    

        @Bean
        public Docket createRestApi() {
    
    
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo()) // 配置说明
                    .select()//选择那些路径和 api 会生成 document
                    .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")) // 拦截的包路径
                    .paths(PathSelectors.any())// 拦截的接口路径
                    .build(); // 创建
        }
        private ApiInfo apiInfo() {
    
    
            return new ApiInfoBuilder()
                    .title("springboot利用swagger构建api文档"))// 标题
                    .description("SpringBoot整合Swagger,详细信息......")// 描述
                    .version("1.0")// 版本
                    .contact(new Contact("倍速提供","www.baidu.com","[email protected]"))// 联系
                    .termsOfServiceUrl("http://baidu.com")
                    .build();
        }
}

测试

http://localhost:8080/swagger-ui.html

自定义注解的使用

@ApiIgnore忽略暴露的 api
@ApiOperation(value = "查找", notes = "根据用户 ID 查找用户") 添加说明
其他注解: 
@Api:用在类上,说明该类的作用
@ApiImplicitParams:用在方法上包含一组参数说明
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses 中,一般用于表达一个错误的响应信息code:数字,例如 400message:信息,例如"请求参数没填好"response:抛出异常的类
@ApiModel:描述一个 Model 的信息(这种一般用在 post 创建的时候,使用@RequestBody 这样的场
景,请求参数无法使用@ApiImplicitParam 注解进行描述的时候)
@ApiModelProperty:描述一个 model 的属性

SpringBoot集成日志

支持日志框架:Java Util Logging, Log4J2 and Logback,默认是使用logback
配置方式:默认配置文件配置和引用外部配置文件配置

配置文件配置

默认配置文件配置(不建议使用:不够灵活,对log4j2等不够友好)
日志文件名,比如:roncoo.log,或者是 /var/log/roncoo.log
logging.file=roncoo.log
日志级别配置,比如: logging.level.org.springframework=DEBUG
logging.level.*=info
logging.level.org.springframework=DEBUG
日志级别:ERROR、WARN、INFO、DEBUG、TRACE
默认情况下,只有INFO级别以上的信息才会打印到控制台,可以自己设定日志输出级别,application.properties中加入以下代码:

logging.level.root=info
#org包下的日志级别
logging.level.org=warn
logging.level.cn.yunhe=debug

引用外部配置文件

logback配置方式:

spring boot默认会加载classpath:logback-spring.xml或者classpath:logback-spring.groovy
使用自定义配置文件,配置方式为:
logging.config=classpath:logback-roncoo.xml
注意:不要使用logback这个来命名,否则spring boot将不能完全实例化
使用基于spring boot的配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>

log4j配置

2.2.1去除logback的依赖包,添加log4j2的依赖包

           <exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>

<!-- 使用log4j2 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>

2.2.2 在classpath添加log4j2.xml或者log4j2-spring.xml(spring boot 默认加载)
2.3 自定义配置文件

部署Spring Boot应用

以jar包方式运行

Spring Boot默认以jar包方式运行,可以在Maven配置如下插件,将SpringBoot导出成可执行的jar文件

<build>
  <plugins>
...
<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</argifactId>
  <configuration>
      <executable>true</executable>
  </configuration>
</plugin>
  <plugins>
<bulid>

在工程目录下运行命令 mvn package,会将Mavne工程打包成一个可执行的jar文件存放到target目录下。
为了验证打包成功,可以以jar方式运行打包好的xxx.jar:

  > java -jar  xxx.jar

也可以部署到服务器上,以jar方式运行。通常情况下还需要指定服务器端口、数据库连接地址等信息:

>java -jar -Dserver.port=9000 -Dspring.datasource.password=123456  xxx.jar
或
>javar -jar xxx.jar  --server.port=9000  --spring.datasource.password=123456

以war方式部署

a)修改打包方式为war
war
b)将嵌入式的Tomcat依赖改成provided:

org.springframework.boot
spring-boot-starter-tomcat
provided

c)将工程的启动类进行修改,使其继承SpringBootServletInitializer类,并重载configure方法
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44226883/article/details/115697171