参考资料

SpringBoot2.4.3官方文档

学习SpringBoot最权威的资料当然还是官方文档了:Spring Boot Reference Documentation
The reference documentation consists of the following sections(参考文档由如下部分组成):

Legal Legal information.
Documentation Overview About the Documentation, Getting Help, First Steps, and more.
Getting Started Introducing Spring Boot, System Requirements, Servlet Containers, Installing Spring Boot, Developing Your First Spring Boot Application
Using Spring Boot Build Systems, Structuring Your Code, Configuration, Spring Beans and Dependency Injection, DevTools, and more.
创建系统/工程,构建代码,配置,Spring Beans和依赖注入,开发工具等等
Spring Boot Features Profiles配置, Logging日志, Security安全, Caching缓存, Spring Integration集成, Testing测试, and more.
Spring Boot Actuator Monitoring, Metrics, Auditing, and more.
Deploying Spring Boot Applications Deploying to the Cloud, Installing as a Unix application.
Spring Boot CLI Installing the CLI, Using the CLI, Configuring the CLI, and more.
Build Tool Plugins Maven Plugin, Gradle Plugin, Antlib, and more.
“How-to” Guides Application Development, Configuration, Embedded Servers, Data Access, and many more.

The reference documentation has the following appendices:

Application Properties Common application properties that can be used to configure your application.
Configuration Metadata Metadata used to describe configuration properties.
Auto-configuration Classes Auto-configuration classes provided by Spring Boot.
Test Auto-configuration Annotations Test-autoconfiguration annotations used to test slices of your application.
Executable Jars Spring Boot’s executable jars, their launchers, and their format.
Dependency Versions Details of the dependencies that are managed by Spring Boot.

【江南一点雨】

Bilibili教程:https://space.bilibili.com/49484631/

SpringBoot教程-案例代码

code-samples 对应的文章
spring-boot-starter-custom 徒手撸一个 Spring Boot 中的 Starter ,解密自动化配置黑魔法!
api.js Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
javassm 这一次,我连 web.xml 都不要了,纯 Java 搭建 SSM 环境
properties 是时候彻底搞清楚 Spring Boot 的配置文件 application.properties 了!
redis Spring Boot 操作 Redis,三种方案全解析!
sessionshare Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
restful Spring Boot 中 10 行代码构建 RESTful 风格应用
shiro Spring Boot 整合 Shiro ,两种方式全总结!
quartz Spring Boot 中实现定时任务的两种方式!
ehcache 另一种缓存,Spring Boot 整合 Ehcache
thymeleaf 极简 Spring Boot 整合 Thymeleaf 页面模板
exception Spring Boot 中关于自定义异常处理的套路!
jdbctemplate Spring Boot数据持久化之JdbcTemplate
jdbcmulti Spring Boot多数据源配置之JdbcTemplate
mybatis 最简单的SpringBoot整合MyBatis教程
mybatismulti 极简Spring Boot整合MyBatis多数据源
jpa 是时候了解下Spring Boot整合 Jpa啦
jpamulti Spring Boot 整合 Jpa 多数据源
jwt 干货|一个案例学会Spring Security 中使用 JWT!
security_json SpringSecurity登录使用JSON格式数据
swagger2 SpringBoot整合Swagger2,再也不用维护接口文档了!
cors Spring Boot中通过CORS解决跨域问题
freemarker Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?
mail Spring Boot 邮件发送的 5 种姿势!
docker 一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!
https Spring Boot 支持 Https 有那么难吗?
jwt-demo Spring Security 结合 Jwt 实现无状态登录
docker-jib 别用 Dockerfile 部署 Spring Boot 啦!松哥教你两步搞定!

SpringBoot四大核心

  • 自动配置
  • 起步依赖
  • Actuator
  • 命令行界面

【遇见狂神说】

Bilibili教程:https://space.bilibili.com/95256449

KuangStudy:https://www.kuangstudy.com/course

博客园:https://www.cnblogs.com/hellokuangshen/tag/SpringBoot系列/

【编程不良人】

学习资料下载:https://www.baizhiedu.xin/

Bilibili教程:https://space.bilibili.com/352224540

【动力节点PowerNode】

Bilibili教程:https://space.bilibili.com/76542346

官网资料:http://www.bjpowernode.com/tutorial/

【Springmeng&王汉远】

Bilibili教程-springmeng:https://space.bilibili.com/395452961/

Bilibili教程-王汗远:https://space.bilibili.com/431642687/

【尚学堂】

Bilibili教程:https://space.bilibili.com/392179313/

【扣丁狼】

Bilibili教程:https://space.bilibili.com/320032672/

【C语言中文网】

参考:http://c.biancheng.net/spring_boot/

SpringBoot的前世今生

1、Spring能做什么

1.1、Spring的能力

image.png

1.2、Spring的生态

https://spring.io/projects/spring-boot
覆盖了:

  • web开发
  • 数据访问
  • 安全控制
  • 分布式
  • 消息服务
  • 移动开发
  • 批处理
  • ……

    1.3、Spring5重大升级

    1.3.1、响应式编程
    image.png
    1.3.2、内部源码设计
    基于Java8的一些新特性,如:接口默认实现。重新设计源码架构。

    2、为什么用SpringBoot

    Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. 能快速创建出生产级别的Spring应用(简化开发)

2.1、SpringBoot优点

  • Create stand-alone Spring applications
    • 创建独立Spring应用
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
    • 内嵌web服务器
  • Provide opinionated ‘starter’ dependencies to simplify your build configuration
    • 自动starter依赖,简化构建配置
  • Automatically configure Spring and 3rd party libraries whenever possible
    • 自动配置Spring以及第三方功能
  • Provide production-ready features such as metrics, health checks, and externalized configuration
    • 提供生产级别的监控、健康检查及外部化配置
  • Absolutely no code generation and no requirement for XML configuration
    • 无代码生成、无需编写XML

      SpringBoot是整合Spring技术栈的一站式框架 SpringBoot是简化Spring技术栈的快速开发脚手架

2.2、SpringBoot缺点

  • 人称版本帝,迭代快,需要时刻关注变化
  • 封装太深,内部原理复杂,不容易精通

    3、时代背景

    3.1、微服务

    James Lewis and Martin Fowler (2014) 提出微服务完整概念。https://martinfowler.com/microservices/

    In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.— James Lewis and Martin Fowler (2014)

  • 微服务是一种架构风格

  • 一个应用拆分为一组小型服务
  • 每个服务运行在自己的进程内,也就是可独立部署和升级
  • 服务之间使用轻量级HTTP交互
  • 服务围绕业务功能拆分
  • 可以由全自动部署机制独立部署
  • 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术

    3.2、分布式

    01-SpringBoot基础 - 图3
    分布式的困难

  • 远程调用

  • 服务发现
  • 负载均衡
  • 服务容错
  • 配置管理
  • 服务监控
  • 链路追踪

日志管理

  • 任务调度
  • ……

分布式的解决

  • SpringBoot + SpringCloud

01-SpringBoot基础 - 图4

3.3、云原生

原生应用如何上云。 Cloud Native

上云的困难

  • 服务自愈
  • 弹性伸缩
  • 服务隔离
  • 自动化部署
  • 灰度发布
  • 流量治理
  • ……

上云的解决
01-SpringBoot基础 - 图5

4、如何学习SpringBoot

4.1、官网文档架构

image.png

image.png

查看版本新特性;
https://github.com/spring-projects/spring-boot/wiki#release-notes
image.png

前后端分离数据交互

Java后端和Vue前端数据交互一般采用JSON格式

基本方式

封装RespBean类

  1. package com.xjt.blog.utils;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class RespBean {
  9. private Integer status = 0;
  10. private String msg;
  11. private Object obj;
  12. public static RespBean build(){
  13. return new RespBean();
  14. }
  15. public static RespBean ok(String msg){
  16. return new RespBean(200,msg,null);
  17. }
  18. public static RespBean ok(String msg, Object obj){
  19. return new RespBean(200,msg,obj);
  20. }
  21. public static RespBean error(String msg){
  22. return new RespBean(500,msg,null);
  23. }
  24. public static RespBean error(String msg, Object obj){
  25. return new RespBean(500,msg,obj);
  26. }
  27. }

使用示例:

  1. @RequestMapping("/get")
  2. public Result get(){
  3. HashMap map = new HashMap();
  4. map.put("username","admin");
  5. map.put("password","123456");
  6. Result r = new Result();
  7. r.code(Result.SUCCESS).message("成功访问").data(map);
  8. return r;
  9. }

高级用法

参考RuoYi项目

pom.xml

pom.xml文件标签

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <!--继承 SpringBoot 框架的一个父项目,所有自己开发的 Spring Boot 都必须的继承-->
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.4.3</version>
  12. <relativePath/> <!-- lookup parent from repository -->
  13. </parent>
  14. <!--当前项目的 GAV 坐标-->
  15. <groupId>com.bjpowernode.springboot</groupId>
  16. <artifactId>002-springboot-springmvc</artifactId>
  17. <version>1.0.0</version>
  18. <!--maven 项目名称,可以删除-->
  19. <name>002-springboot-springmvc</name>
  20. <!--maven 项目描述,可以删除-->
  21. <description>Demo project for Spring Boot</description>
  22. <!--maven 属性配置,可以在其它地方通过${}方式进行引用-->
  23. <properties>
  24. <java.version>1.8</java.version>
  25. </properties>
  26. <!--maven依赖-->
  27. <dependencies>
  28. </dependencies>
  29. <build>
  30. <plugins>
  31. <!--SpringBoot 提供的打包编译等插件-->
  32. <plugin>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-maven-plugin</artifactId>
  35. </plugin>
  36. </plugins>
  37. </build>
  38. <!--保留src/main/java 路径下的xml数据库映射文件-->
  39. <resources>
  40. <resource>
  41. <directory>src/main/java</directory>
  42. <includes>
  43. <include>**/*.properties</include>
  44. <include>**/*.xml</include>
  45. </includes>
  46. <filtering>false</filtering>
  47. </resource>
  48. <resource>
  49. <directory>src/main/resources</directory>
  50. <includes>
  51. <include>**/*.properties</include>
  52. <include>**/*.xml</include>
  53. </includes>
  54. <filtering>false</filtering>
  55. </resource>
  56. </resources>
  57. </project>

常用的Maven依赖

  1. <!--springboot的web服务starter-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!--springboot测试starter-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-test</artifactId>
  10. <scope>test</scope>
  11. </dependency>
  12. <!--热部署-->
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-devtools</artifactId>
  16. <scope>runtime</scope>
  17. <optional>true</optional>
  18. </dependency>
  19. <!--lombok-->
  20. <dependency>
  21. <groupId>org.projectlombok</groupId>
  22. <artifactId>lombok</artifactId>
  23. <optional>true</optional>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-freemarker</artifactId>
  28. </dependency>
  29. <!--mysql数据库连接驱动-->
  30. <dependency>
  31. <groupId>mysql</groupId>
  32. <artifactId>mysql-connector-java</artifactId>
  33. <version>8.0.25</version>
  34. </dependency>
  35. <!--mybatis-plus-->
  36. <dependency>
  37. <groupId>com.baomidou</groupId>
  38. <artifactId>mybatis-plus-boot-starter</artifactId>
  39. <version>3.4.2</version>
  40. </dependency>
  41. <!--集成thymeleaf模板-->
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  45. </dependency>
  46. <!--集成redis数据库-->
  47. <dependency>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-starter-data-redis</artifactId>
  50. </dependency>
  51. <!--集成javax.mail邮件-->
  52. <dependency>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-starter-mail</artifactId>
  55. <version>2.4.1</version>
  56. </dependency>
  57. <!--集成springsecurity安全框架-->
  58. <dependency>
  59. <groupId>org.springframework.boot</groupId>
  60. <artifactId>spring-boot-starter-security</artifactId>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.thymeleaf.extras</groupId>
  64. <artifactId>thymeleaf-extras-springsecurity5</artifactId>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.springframework.security</groupId>
  68. <artifactId>spring-security-test</artifactId> <!--springsecurity测试(可选)-->
  69. <scope>test</scope>
  70. </dependency>
  71. <!--导入shiro-redis的starter包-->
  72. <dependency>
  73. <groupId>org.crazycake</groupId>
  74. <artifactId>shiro-redis-spring-boot-starter</artifactId>
  75. <version>3.3.1</version>
  76. </dependency>
  77. <!-- hutool工具类-->
  78. <dependency>
  79. <groupId>cn.hutool</groupId>
  80. <artifactId>hutool-all</artifactId>
  81. <version>5.1.4</version>
  82. </dependency>
  83. <!--jwt-->
  84. <dependency>
  85. <groupId>io.jsonwebtoken</groupId>
  86. <artifactId>jjwt</artifactId>
  87. <version>0.9.1</version>
  88. </dependency>
  89. <!--集成druid数据库连接池 springboot2.x以上默认使用com.zaxxer.hikari.HikariDataSource 数据源-->
  90. <dependency>
  91. <groupId>com.alibaba</groupId>
  92. <artifactId>druid</artifactId>
  93. <version>1.1.24</version>
  94. </dependency>
  95. <dependency>
  96. <groupId>log4j</groupId>
  97. <artifactId>log4j</artifactId> <!--druid连接池需要log4j日志框架-->
  98. <version>1.2.17</version>
  99. </dependency>

配置 Annotation Processor
可以帮助我们生成自定义配置的元数据信息,让配置文件和Java代码之间的对应参数可以自动定位,方
便开发。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-configuration-processor</artifactId>
  4. <optional>true</optional>
  5. </dependency>

maven离线安装jar

  1. ##1、首先到mvnrepository下载jar包
  2. <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
  3. <dependency>
  4. <groupId>org.apache.tomcat.embed</groupId>
  5. <artifactId>tomcat-embed-jasper</artifactId>
  6. <version>9.0.40</version>
  7. </dependency>
  8. ##2、安装命令
  9. mvn install:install-file -Dfile=tomcat-embed-jasper.jar -DgroupId=org.apache.tomcat.embed -DartifactId=tomcat-embed-jasper -Dversion=9.0.40 -Dpackaging=jar

核心配置文件

配置文件可以存放在四个不同位置,对应的优先级也不同
image.png

application.properties

  1. server.port=8181
  2. server.servlet.context-path=/shiro
  3. spring.application.name=shiro-jsp
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://localhost:3306/my-shiro-jsp?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
  6. spring.datasource.username=root
  7. spring.datasource.password=root
  8. spring.mvc.view.prefix=/
  9. spring.mvc.view.suffix=.jsp
  10. mybatis.mapper-locations=classpath*:mapper/*.xml
  11. mybatis.type-aliases-package=com.xjt.entity
  12. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

application.yaml

  1. fdfs:
  2. soTimeout: 1500
  3. connectTimeout: 600
  4. thumbImage:
  5. width: 150
  6. height: 150
  7. trackerList:
  8. - 192.168.157.129:22122
  9. spring:
  10. datasource:
  11. driver-class-name: com.mysql.cj.jdbc.Driver
  12. url: jdbc:mysql://localhost:3306/my-fastdfs?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
  13. username: root
  14. password: root
  15. type:
  16. com.alibaba.druid.pool.DruidDataSource
  17. profiles:
  18. active: dev #2.4以上版本不同
  19. servlet:
  20. multipart:
  21. max-file-size: 100MB
  22. max-request-size: 1000MB
  23. # 配置 redis
  24. redis:
  25. port: 6379
  26. host: 127.0.0.1
  27. database: 0
  28. timeout: 3000
  29. mvc:
  30. view:
  31. prefix: /
  32. suffix: .html
  33. server:
  34. port: 8080
  35. servlet:
  36. context-path: /
  37. mybatis-plus:
  38. configuration:
  39. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  40. cache-enabled: true
  41. mapper-locations: classpath:/mapper/*.xml
  42. type-aliases-package: com.xjt.shiro.domain

自定义配置

在 SpringBoot 的核心配置文件中,除了使用内置的配置项之外,我们还可以在自定义配置,然后采用注解去读取配置
的属性值。有两种方式的自定义配置项,一是将所有配置项都放在application.properties,二是拆分出其他配置文件
1、在核心配置文件applicatin.properties 中,添加两个自定义配置项
在 IDEA 中可以看到这两个属性不能被 SpringBoot 识别,背景是桔色的
image.png

  1. @Value("${xjt.name}")
  2. private String name;

2、自定义配置文件,通过注解初始化@PropertySource @Value @ConfigurationProperties
image.png
@PropertySource 和 @Value

  1. @Component
  2. @PropertySource(value = {"classpath:props/person.properties"})
  3. public class MyPeople {
  4. @Value("${person.name}")
  5. private String name;
  6. @Value("${person.sex}")
  7. private Integer sex;
  8. @Value("${person.age}")
  9. private Integer age;
  10. @Value("${person.city}")
  11. private String city;
  12. @Value("${person.school}")
  13. private String school;
  14. }

@PropertySource 和 @ConfigurationProperties

  1. @Component
  2. @PropertySource(value = {"classpath:props/datasource.properties"})
  3. @ConfigurationProperties(prefix = "xxxmysql.datasource")
  4. @Data
  5. public class MyJDBC {
  6. private String driver;
  7. private String url;
  8. private String username;
  9. private String password;
  10. }

注意:xxxmysql.datasource前缀的属性 必须和MyJDBC对应是字段名称一致

IDEA相关

mvn下载框架的java源码

如springboot项目无法查看源码用bash 切换到项目的 目录 有pom.xml的地方在终端中输入

  1. mvn dependency:resolve -Dclassifier=sources

项目打包&部署

1、打包并运行jar

在命令行中运行某个jar 包

  1. java -jar xxx.jar
  2. java -jar xxx.jar --server.port=8181 #指定端口

Maven

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.4.3</version> <!--父依赖版本号-->
  10. <relativePath/> <!-- lookup parent from repository -->
  11. </parent>
  12. <groupId>org.example</groupId>
  13. <artifactId>springboot_thymeleaf_shiro</artifactId>
  14. <version>1.0-SNAPSHOT</version>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. <maven.compiler.source>1.8</maven.compiler.source>
  18. <maven.compiler.target>1.8</maven.compiler.target>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. </dependencies>
  26. </project>

2、打成war包

SpringBoot解决跨域问题跨域

目前大型项目一般采用的是前后端分离,当使用前端 vue + axios 发送跨域请求时会报错,如下
image.png
有如下解决方式:

全局配置

config/MyWebMvcConfig.java

  1. @Configuration
  2. public class MyWebMvcConfig extends WebMvcConfigurerAdapter {
  3. /**
  4. * 就是注册的过程,注册Cors协议的内容。
  5. * 如: Cors协议支持哪些请求URL,支持哪些请求类型,请求时处理的超时时长是什么等。
  6. */
  7. @Override
  8. public void addCorsMappings(CorsRegistry registry) {
  9. registry
  10. .addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问。
  11. .allowedMethods("GET", "POST", "PUT", "DELETE") // 当前站点支持的跨域请求类型
  12. .allowCredentials(true) // 是否支持跨域用户凭证
  13. .allowedOrigins("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
  14. .maxAge(60); // 超时时长设置为1小时。 时间单位是秒。
  15. }
  16. }

单个接口使用注解@CrossOrigin

  1. @RestController
  2. @RequestMapping("/user")
  3. @RequiredArgsConstructor
  4. @CrossOrigin(origins = "*",maxAge = 3600)
  5. public class UserController {
  6. @Autowired
  7. private UserMapper userMapper;
  8. @GetMapping("/getOne/{id}")
  9. public User getOne(@PathVariable("id") Integer id) {
  10. return userMapper.getById(id);
  11. }
  12. }

/user/** 开头的请求可以跨域,其他请求 如 /book/** 就不行了

自定义跨域过滤器

1、编写过滤器

  1. public class CrosFilter implements Filter {
  2. @Override
  3. public void init(FilterConfig filterConfig) throws ServletException {
  4. // TODO Auto-generated method stub
  5. }
  6. @Override
  7. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  8. throws IOException, ServletException {
  9. HttpServletResponse res = (HttpServletResponse) response;
  10. HttpServletRequest req = (HttpServletRequest) request;
  11. String origin = req.getHeader("Origin");
  12. if (!org.springframework.util.StringUtils.isEmpty(origin)) {
  13. //带cookie的时候,origin必须是全匹配,不能使用*
  14. res.addHeader("Access-Control-Allow-Origin", origin);
  15. }
  16. res.addHeader("Access-Control-Allow-Methods", "*");
  17. String headers = req.getHeader("Access-Control-Request-Headers");
  18. // 支持所有自定义头
  19. if (!org.springframework.util.StringUtils.isEmpty(headers)) {
  20. res.addHeader("Access-Control-Allow-Headers", headers);
  21. }
  22. res.addHeader("Access-Control-Max-Age", "3600");
  23. // enable cookie
  24. res.addHeader("Access-Control-Allow-Credentials", "true");
  25. chain.doFilter(request, response);
  26. }
  27. @Override
  28. public void destroy() {
  29. // TODO Auto-generated method stub
  30. }
  31. }

2、注册过滤器

  1. @Bean
  2. public FilterRegistrationBean registerFilter(){
  3. FilterRegistrationBean bean = new FilterRegistrationBean();
  4. bean.addUrlPatterns("/*");
  5. bean.setFilter(new CrosFilter());
  6. return bean;
  7. }

使用nginx反向代理服务器解决跨域问题

1、在nginx的conf目录下,创建vhosts文件夹
2、在nginx.conf 文件中添加 include vhosts/*.conf
image.png
3、vhost目录下创建 abc.conf文件
image.png

thymeleaf

基础

th:src th:href路径

image.png
image.png

WebMvcConfigurer配置

addResourceHandlers资源处理器

image.png
案例:上传文件保存到项目根路径,想要直接通过 http://127.0.0.1:8888/img/singerPic/123.jpg 访问,需要我们配置addResourceHandlers资源处理器

  1. @Configuration
  2. public class FileConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addResourceHandlers(ResourceHandlerRegistry registry){
  5. //歌手头像地址
  6. registry.addResourceHandler("/img/singerPic/**").addResourceLocations(
  7. "file:"+System.getProperty("user.dir")+System.getProperty("file.separator")+"img"
  8. +System.getProperty("file.separator")+"singerPic"+System.getProperty("file.separator")
  9. );
  10. }
  11. }

说一下 file:///D:/ 是什么呢??
这是UNC定义的一种本地绝对路径的表示方式,可以在浏览器中直接这样访问
image.png
来看看这些吧:

  1. String path = "file:" + System.getProperty("user.dir")
  2. + System.getProperty("file.separator") + "img"
  3. + System.getProperty("file.separator") + "songListPic"
  4. + System.getProperty("file.separator");
  5. //项目的绝对路径
  6. System.out.println(System.getProperty("user.dir")); //D:\CodeLearning\JavaLearning\JavaProjects\github_master\王汉远-springboot+vue音乐网站\分章节源码\music142 程序完成\music-server
  7. //系统文件分隔符
  8. System.out.println(System.getProperty("file.separator")); // \ (windows系统是\ Linux系统是 /)
  9. System.out.println(path); //file:D:\CodeLearning\JavaLearning\JavaProjects\github_master\王汉远-springboot+vue音乐网站\分章节源码\music142 程序完成\music-server\img\songListPic\

Lombok

https://www.jianshu.com/p/2543c71a8e45
Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
最近IDEA 2020最后一个版本发布了,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置了Lombok依赖。

为什么他们都要支持Lombok呢?

以前的Java项目中,充斥着太多不友好的代码:

  • POJO的getter/setter/toString;
  • 异常处理;
  • I/O流的关闭操作等等

这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。

添加IDEA工具对Lombok的支持
点击File— Settings设置界面,安装Lombok插件:
image.png
引入jar包

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.16</version>
  5. </dependency>

Lombok常用注解

@Data
作用在类上,生成所有成员变量的getter/setter方法和类的toString方法,最常用
是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter

@Getter、@Setter
作用类上,生成所有成员变量的getter/setter方法;
作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。

@ToString
作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。
image.png
@EqualsAndHashCode
作用于类,覆盖默认的equals和hashCode

@NonNull
主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。
image.png
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
作用于类上,用于生成构造函数。有staticName、access等属性。
staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。
@NoArgsConstructor:生成无参构造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;
@AllArgsConstructor:生成全参构造器
image.png
@Builder
作用于类上,将类转变为建造者模式

@Log
作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:

Swagger2

官网:https://swagger.io/
https://zhuanlan.zhihu.com/p/98075551

快速上手

  • pom引入依赖

    1. <dependency>
    2. <groupId>io.springfox</groupId>
    3. <artifactId>springfox-swagger2</artifactId>
    4. <version>2.9.2</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>io.springfox</groupId>
    8. <artifactId>springfox-swagger-ui</artifactId>
    9. <version>2.9.2</version>
    10. </dependency>
  • 项目中新建SwaggerConfig.java配置

01-SpringBoot基础 - 图23

  1. @Configuration
  2. @EnableSwagger2 //开启swagger2
  3. public class SwaggerConfig implements WebMvcConfigurer {
  4. @Override
  5. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  6. // 解决静态资源无法访问
  7. registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
  8. // 解决swagger无法访问
  9. registry.addResourceHandler("/swagger-ui.html")
  10. .addResourceLocations("classpath:/META-INF/resources/");
  11. // 解决swagger的js文件无法访问
  12. registry.addResourceHandler("/webjars/**")
  13. .addResourceLocations("classpath:/META-INF/resources/webjars/");
  14. }
  15. @Bean
  16. public Docket createRestApi() {
  17. return new Docket(DocumentationType.SWAGGER_2)
  18. .apiInfo(xiaomingApiInfo())
  19. .groupName("xiaoxiong")
  20. .select()
  21. //为任何请求处理生成API文档
  22. .apis(RequestHandlerSelectors.any())
  23. //过滤路径
  24. .paths(PathSelectors.any())
  25. .build();
  26. //添加登录认证
  27. /*.securitySchemes(securitySchemes())
  28. .securityContexts(securityContexts());*/
  29. }
  30. private ApiInfo xiaomingApiInfo() {
  31. //作者联系方式
  32. Contact contact = new Contact("xiaoxiong", "https://github.com/BFD2018", "1351655382@qq.com");
  33. return new ApiInfoBuilder()
  34. .title("SwaggerUI演示")
  35. .description("接口文档,描述词省略200字")
  36. .contact(contact)
  37. .version("v1.0")
  38. .build();
  39. }
  40. }

swagger-ui.html静态资源存放位置:
01-SpringBoot基础 - 图24

  • com.xjt.controller.SwaggerController.java

01-SpringBoot基础 - 图25

01-SpringBoot基础 - 图26
可以配置多个Docket,协同开发 ,谁干了哪些活 很清晰
01-SpringBoot基础 - 图27

配置

Docket Bean配置项

  1. @Bean
  2. public Docket createRestApi() {
  3. return new Docket(DocumentationType.SWAGGER_2)
  4. .apiInfo(xiaomingApiInfo())
  5. .groupName("小明")
  6. .select()
  7. //1、为com.xjt.controller包下Controller生成API文档
  8. //.apis(RequestHandlerSelectors.basePackage("com.xjt.controller"))
  9. //2、为有@Api注解的Controller生成API文档
  10. //.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
  11. //3、扫描类上有@RestController注解
  12. //.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
  13. //为有@ApiOperation注解的方法生成API文档
  14. //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  15. //扫描方法上有@GetMapping注解
  16. //.apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class))
  17. //为任何接口生成API文档
  18. .apis(RequestHandlerSelectors.any())
  19. //过滤路径
  20. .paths(PathSelectors.any())
  21. .build();
  22. //添加登录认证
  23. /*.securitySchemes(securitySchemes())
  24. .securityContexts(securityContexts());*/
  25. }
  26. private ApiInfo xiaomingApiInfo() {
  27. //作者联系方式
  28. Contact contact = new Contact("kuangshenshuo", "http://kuangstudy.com", "1351655382@qq.com");
  29. return new ApiInfoBuilder()
  30. .title("SwaggerUI演示")
  31. .description("接口文档,描述词省略200字")
  32. .contact(contact)
  33. .version("v1.0")
  34. .build();
  35. }

注解配置

  • _@_Api
  • _@_ApiOperation

    1. @Api(tags = "用户相关模块") //Controller类注解
    2. @Controller
    3. @RequestMapping(value = "/api/")
    4. public class SwaggerController {
    5. @ApiOperation(value = "查找用户") //方法注解
    6. @GetMapping("/user")
    7. @ResponseBody
    8. private String getUser(){
    9. return "hello-world!";
    10. }
    11. @ApiOperation(value = "注册用户")
    12. @PostMapping("/register")
    13. @ResponseBody
    14. private User registerUser(String name,Integer age){
    15. User user = new User();
    16. user.setName(name);
    17. user.setAge(age);
    18. return user;
    19. }
    20. }

    swagger-ui上显示:
    01-SpringBoot基础 - 图28

  • _@_ApiModel

  • _@_ApiModelProperty

    1. @ApiModel(value = "User-model")
    2. @Data
    3. public class User {
    4. @ApiModelProperty("User-name")
    5. private String name;
    6. @ApiModelProperty("User-age")
    7. private Integer age;
    8. private String phone;
    9. }

    swagger-ui上显示:(注意:只有Controller方法中返回Model才能显示)
    01-SpringBoot基础 - 图29

  • _@_ApiParam

    1. @ApiOperation(value = "注册用户")
    2. @PostMapping("/register")
    3. @ResponseBody
    4. private User registerUser(@ApiParam(value = "用户名") String name, @ApiParam(value = "用户年龄") Integer age){
    5. User user = new User();
    6. user.setName(name);
    7. user.setAge(age);
    8. return user;
    9. }

    swagger-ui上显示:
    01-SpringBoot基础 - 图30

    生产环境去掉Swagger

    com.xjt.config.SwaggerConfig.java

    1. @Bean
    2. public Docket docket2(Environment environment) {
    3. //设置要显示的swagger环境
    4. Profiles profiles = Profiles.of("dev", "test");
    5. //通过environment.acceptsProfiles() 判断是否处于dev 或test环境
    6. boolean flag = environment.acceptsProfiles(profiles);
    7. return new Docket(DocumentationType.SWAGGER_2)
    8. .groupName("小刚")
    9. .apiInfo(xiaogangApiInfo())
    10. .enable(flag) //开启swagger2
    11. .select()
    12. .apis(RequestHandlerSelectors.basePackage("com.xjt.controller"))
    13. .build();
    14. }

    springboot配置文件
    01-SpringBoot基础 - 图31
    显示出来了
    01-SpringBoot基础 - 图32

    日志配置

    背景:我们都知道springboot默认日志是打印在控制台中的,不会以文件的形式进行保存。那么日后系统上线肯定是有需要对日志进行定位分析问题的,那么如何实现将控制台输出的日志保存起来?
    话不多说,实际效果如下,如果是你预期的那样,咱们接着往下看。

如下是集成,按步骤来:
1、在项目的resources目录下创建一个名为logback-spring.xml的日志配置文件,配置文件名最好跟我一样;
image.png
2、编写xml文件内容:
code中每句都给出了注释,方便你们理解。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <!-- 引入默认得配置文件 -->
  4. <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
  5. <!-- 模块名标识日志名称 -->
  6. <springProperty scope="context" name="springAppName" source="spring.application.name"/>
  7. <!-- info日志单文件大小限制 -->
  8. <springProperty scope="context" name="logback.fileInfoLog.maxFileSize" source="logback.fileInfoLog.maxFileSize" defaultValue="200MB" />
  9. <!-- info日志最大保留时长单位天 -->
  10. <springProperty scope="context" name="logback.fileInfoLog.maxHistory" source="logback.fileInfoLog.maxHistory" defaultValue="15" />
  11. <!-- info日志文件总大小,超过该大小,旧得即将删除 -->
  12. <springProperty scope="context" name="logback.fileInfoLog.totalSizeCap" source="logback.fileInfoLog.totalSizeCap" defaultValue="100GB" />
  13. <!-- error日志单文件大小限制 -->
  14. <springProperty scope="context" name="logback.fileErrorLog.maxFileSize" source="logback.fileErrorLog.maxFileSize" defaultValue="200MB" />
  15. <!-- error日志最大保留时长单位天 -->
  16. <springProperty scope="context" name="logback.fileErrorLog.maxHistory" source="logback.fileErrorLog.maxHistory" defaultValue="15" />
  17. <!-- error日志文件总大小,超过该大小,旧得即将删除 -->
  18. <springProperty scope="context" name="logback.fileErrorLog.totalSizeCap" source="logback.fileErrorLog.totalSizeCap" defaultValue="100GB" />
  19. <!-- http日志单文件大小限制 -->
  20. <springProperty scope="context" name="logback.fileHttpLog.maxFileSize" source="logback.fileHttpLog.maxFileSize" defaultValue="200MB" />
  21. <!-- http日志最大保留时长单位天 -->
  22. <springProperty scope="context" name="logback.fileHttpLog.maxHistory" source="logback.fileHttpLog.maxHistory" defaultValue="15" />
  23. <!-- http日志文件总大小,超过该大小,旧得即将删除 -->
  24. <springProperty scope="context" name="logback.fileHttpLog.totalSizeCap" source="logback.fileHttpLog.totalSizeCap" defaultValue="100GB" />
  25. <!-- 日志目录 -->
  26. <springProperty scope="context" name="logback.rootDir" source="logback.rootDir" defaultValue="logs"/>
  27. <!-- 控制台输出得日志格式 -->
  28. <property name="CONSOLE_LOG_PATTERN"
  29. value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
  30. <!-- 日志文件输出得日志格式 -->
  31. <property name="FILE_LOG_PATTERN"
  32. value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"/>
  33. <!-- 控制台输出 -->
  34. <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
  35. <layout class="ch.qos.logback.classic.PatternLayout">
  36. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  37. </layout>
  38. </appender>
  39. <!-- info日志得设定 -->
  40. <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  41. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  42. <level>ERROR</level>
  43. <onMatch>DENY</onMatch>
  44. <onMismatch>ACCEPT</onMismatch>
  45. </filter>
  46. <encoder>
  47. <pattern>${FILE_LOG_PATTERN}</pattern>
  48. </encoder>
  49. <file>${logback.rootDir}/${springAppName}.log</file>
  50. <!--滚动策略-->
  51. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" >
  52. <!--路径-->
  53. <fileNamePattern>${logback.rootDir}/%d{yyyy-MM,aux}/%d{yyyy-MM-dd,aux}/${springAppName}-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
  54. <maxFileSize>${logback.fileInfoLog.maxFileSize}</maxFileSize>
  55. <maxHistory>${logback.fileInfoLog.maxHistory}</maxHistory>
  56. <totalSizeCap>${logback.fileInfoLog.totalSizeCap}</totalSizeCap>
  57. <cleanHistoryOnStart>true</cleanHistoryOnStart>
  58. </rollingPolicy>
  59. </appender>
  60. <!-- 错误日志 -->
  61. <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  62. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  63. <level>ERROR</level>
  64. </filter>
  65. <encoder>
  66. <pattern>${FILE_LOG_PATTERN}</pattern>
  67. </encoder>
  68. <file>${logback.rootDir}/${springAppName}-error.log</file>
  69. <!--滚动策略-->
  70. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" >
  71. <!--路径-->
  72. <fileNamePattern>${logback.rootDir}/%d{yyyy-MM,aux}/%d{yyyy-MM-dd,aux}/${springAppName}-error-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
  73. <maxFileSize>${logback.fileErrorLog.maxFileSize}</maxFileSize>
  74. <maxHistory>${logback.fileErrorLog.maxHistory}</maxHistory>
  75. <totalSizeCap>${logback.fileErrorLog.totalSizeCap}</totalSizeCap>
  76. <cleanHistoryOnStart>true</cleanHistoryOnStart>
  77. </rollingPolicy>
  78. </appender>
  79. <!-- http日志 -->
  80. <appender name="httpInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  81. <encoder>
  82. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %m%n</pattern>
  83. </encoder>
  84. <file>${logback.rootDir}/${springAppName}-http.log</file>
  85. <!--滚动策略-->
  86. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  87. <!--路径-->
  88. <fileNamePattern>${logback.rootDir}/%d{yyyy-MM,aux}/%d{yyyy-MM-dd,aux}/${springAppName}-http-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
  89. <maxFileSize>${logback.fileHttpLog.maxFileSize}</maxFileSize>
  90. <maxHistory>${logback.fileHttpLog.maxHistory}</maxHistory>
  91. <totalSizeCap>${logback.fileHttpLog.totalSizeCap}</totalSizeCap>
  92. <cleanHistoryOnStart>true</cleanHistoryOnStart>
  93. </rollingPolicy>
  94. </appender>
  95. <appender name="ASYNC_consoleLog" class="ch.qos.logback.classic.AsyncAppender">
  96. <appender-ref ref="consoleLog"/>
  97. </appender>
  98. <appender name="ASYNC_fileInfoLog" class="ch.qos.logback.classic.AsyncAppender">
  99. <appender-ref ref="fileInfoLog"/>
  100. </appender>
  101. <appender name="ASYNC_fileErrorLog" class="ch.qos.logback.classic.AsyncAppender">
  102. <appender-ref ref="fileErrorLog"/>
  103. </appender>
  104. <appender name="ASYNC_httpInfoLog" class="ch.qos.logback.classic.AsyncAppender">
  105. <appender-ref ref="httpInfoLog"/>
  106. </appender>
  107. <root level="info">
  108. <appender-ref ref="ASYNC_consoleLog" />
  109. <appender-ref ref="ASYNC_fileInfoLog" />
  110. <appender-ref ref="ASYNC_fileErrorLog" />
  111. </root>
  112. <logger name="log_http" additivity="false" level="INFO">
  113. <appender-ref ref="ASYNC_httpInfoLog"/>
  114. </logger>
  115. </configuration>

3、配置日志配置中所提到的springAppName;
image.png
4、使用这个默认不用配置pom依赖,最新的spring-boot-starter-web中已经集成了。如下,重启下项目就能自动生成日志文件了,而且是实时写入的,控制台输出什么,立马就更新进到该xxx.log里头。
image.png
记得,配置日志完后,记得刷新下maven或者关闭下项目重新打开,以免误导大家以为日志配置没用。

原文链接:https://blog.csdn.net/weixin_43970743/article/details/115767763

另外:
想要在控制台打印sql,如下:

  1. mybatis-plus:
  2. configuration:
  3. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #控制台打印sql执行语句
  4. cache-enabled: true
  5. mapper-locations: classpath:/mapper/*.xml #映射XXXmapper.xml文件路径
  6. type-aliases-package: com.xjt.travel.domain #包名