Springboot:

入门:

@ComponentScan注解:

1
2
@ComponentScan(basePackages = "org.javaboy", useDefaultFilters = true,
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)})

@ComponentScan注解用于定义扫描的路径,从中找出标识了需要装配的类自动装配到Spring的Bean容器中。basePackages属性用于指定扫描路径,可以是单个路径,也可以是扫描的路径数组。如果不指定该属性,则默认扫描该注解所在类的同级目录及其子目录下所有的类。useDefaultFilters属性默认为true,表示开启默认过滤器,即只有标注了@Component、@Repository、@Service、@Controller等注解的类才会被装配到Spring的Bean容器中。如果不想使用默认过滤器,可以将该属性设置为false。如果需要排除某些类,则可以使用excludeFilters属性,该属性接收一个数组参数,数组中每个元素都是一个过滤器。在这里,您使用了一个排除过滤器,即排除所有标注了@Controller注解的类。

DispatcherServlet:

Just a moment…
springmvc流程图:
image.png
**_Front Controller _**主要职责包括:

  • 拦截传入请求
  • 将请求的有效负载(请求的有效载荷就是请求中的数据部分,也就是请求体部分)转换为数据的内部结构
  • 将数据发送到_模型_进行进一步处理
  • 从模型中获取处理后的数据_,_并将该数据推进到_视图_进行渲染

DispatcherServlet 在架构中扮演着 Front Controller 的角色。该图既适用于典型的 MVC 控制器,也适用于 RESTful 控制器,但有一些细微的差异(如下所述)。
在传统方法中,MVC 应用程序不是面向服务的;因此,有一个 V_iew 解析器_,它根据从 Controller 接收的数据呈现最终视图。
RESTful 应用程序被设计为面向服务并返回原始数据(通常为 JSON/XML)。由于这些应用程序不执行任何视图渲染,因此没有_视图解析器,并且通常期望控制器_通过 HTTP 响应直接发送数据。

ServletContext:

1.一个web应用只有一个ServletContext。
2,在web应用部署成功后,servlet容器为应用创建了ServletContext实例,当服务器关闭时,其才被释放。在web中,一个用户可以有多个request;一个用户有一个session,而ServletContext,是所有的用户共用一个。所以,ServletContext的存在,就是为了存放必须的、重要的、所有用户需要共享的、线程又是安全的一些资源信息,这样不仅节省了空间,还提高了效率
image.png

消息转换器:

https://cloud.tencent.com/developer/article/1666635
Just a moment…
1.@RestController 注解即可将返回的数据结构转换成 Json 格式;@ResponseBody 注解是将返回的数据结构转换为 Json 格式。
2.要自定义JSON转换可以在相关配置类中重写configureMessageConverters方法。

基础配置:

application.properties配置文件的位置和顺序:

  1. 当前项目根目录下的 config 目录下
  2. 当前项目的根目录下
  3. resources 目录下的 config 目录下
  4. resources 目录下

按如上顺序,四个配置文件的优先级依次降低。如下:
image.png
SpringBoot 启动配置文件加载和参数配置修改问题_springboot 动态修改properties-CSDN博客

通过配置文件实现属性注入:

修改SpringBoot默认的启动图案_springboot项目启动动画-CSDN博客

properties版本:

法1:
image.png
法2:自定义属性配置文件
image.png
法3:
image.png
yaml文件的数组注入:
image.png
YAML 语言教程 - 阮一峰的网络日志
YAML文件是有序的。这意味着在YAML文件中,键值对的顺序是被保留的,并且在读取配置文件时会按照它们的出现顺序进行处理。
image.png

配置文件多环境区分:

嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种? - 爱撒谎的男孩 - 博客园
1.创建不同环境的配置文件:
既然每个环境的配置都不相同,索性将不同环境的配置放在不同的配置文件中,因此需要创建三个不同的配置文件,分别是application-dev.propertiesapplication-test.propertiesapplication-prod.properties
「注意」:配置文件的名称一定要是application-name.properties或者application-name.yml格式。这个name可以自定义,主要用于区分。
此时整个项目中就有四个配置文件,加上application.properties
2.指定运行的环境
虽然你创建了各个环境的配置文件,但是Spring Boot 仍然不知道你要运行哪个环境,有以下两种方式指定:
配置文件中指定:
在application.properties或者application.yml文件中指定,内容如下:

1
2
指定运行环境为测试环境
spring.profiles.active=test

如果没有指定运行的环境,Spring Boot 默认会加载application.properties文件,而这个的文件又告诉Spring Boot 去找test环境的配置文件。
运行 jar 的时候指定:
Spring Boot 内置的环境切换能够在运行Jar包的时候指定环境,命令如下:

1
java -jar xxx.jar --spring.profiles.active=test

以上命令指定了运行的环境是test

springboot关于tomcat的配置:

SpringBoot - 内置的Tomcat服务器配置详解(附:启用HTTPS服务) - 11014p - 博客园

1
2
3
4
5
6
7
server.port:配置 Web 容器的端口号(默认为 8080
server.error.path:配置当前项目出错时跳转去的页面。
server.servlet.session.timeout:配置 session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)
server.servlet.context-path:配置项目名称(默认为 /),如果配置了项目名称,那么在访问路径中要加上配置的路径
server.tomcat.uri-encoding:配置 Tomcat 请求编码
server.tomcat.max-threads:配置 Tomcat 的最大线程数
server.tomcat.basedir:配置 Tomcat 运行日志和临时文件的目录。若不配置,则默认使用系统的临时目录。

其中tomcat的配置选项还有https的配置选项。
image.png

自定义一个start:

整合视图:

整合web开发:

静态资源配置:

/** 表示可以匹配任意层级的路径;

1
2
3
4
5
6
7
8
@Configuration
@ComponentScan(basePackages = "org.sang.javassm")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("/");
}
}

在 Spring Boot 中,默认情况下,一共有5个位置可以放静态资源,五个路径分别是如下5个:

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/
  5. /

第5个 / 其实就是表示 webapp 目录中的静态资源;如果同一个文件分别出现在五个目录下,那么优先级也是按照上面列出的顺序。

@ControllerAdvice 注解

以实现三个方面的功能:

  1. 全局异常处理
  2. 全局数据绑定
  3. 全局数据预处理
1
2
3
4
5
6
7
8
9
10
11
@ControllerAdvice
public class MyGlobalExceptionHandler {
//@ExceptionHandler 注解用来指明异常的处理类型
@ExceptionHandler(Exception.class)
public ModelAndView customException(Exception e) {
ModelAndView mv = new ModelAndView();
mv.addObject("message", e.getMessage());
mv.setViewName("myerror");
return mv;
}
}

全局数据绑定功能可以用来做一些初始化的数据操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。
全局数据预处理:

Model,ModelMap,ModelAndView的区别:
Model, ModelMap, and ModelAndView in Spring MVC | Baeldung
Model、ModelMap和ModelAndView的使用详解-CSDN博客(完整)
Model是一个接口,ModelMap类,ModelAndView是容器:

1
2
3
4
5
Model is an interface that defines a holder for model attributes and is primarily designed for adding attributes to the model. It can supply attributes used for rendering views. To provide a view with usable data, we simply add this data to its Model object. Additionally, maps with attributes can be merged with Model instances.

ModelMap is a class that is also used to pass values to render a view. The advantage of ModelMap is it gives us the ability to pass a collection of values and treat these values as if they were within a Map.

ModelAndView is a container for both a ModelMap and a view object. It allows a controller to return both as a single value.

@ModelAttribute:

【Spring】@ModelAttribute三种使用场景_@modelattribute @valid-CSDN博客
1.用在Controller的方法上:
每次执行方法时都会先执行@ModelAttribute注解的方法(此时该注解修饰的方法是用来准备数据的),并将结果添加到model中。
image.png
@ModelAttribute(“top”)中的top是该Model的名字;
控制台结果:
image.png
2**.用在方法的参数上:**可以直接从指定的模型中中取值.标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。
3.**用在ControllerAdvice的方法中:**每个Controller中的方法执行前都会先执行 @ModelAttribute注解标注的方法,并将返回值添加到model
image.pngSpringBoot2教程29整合SpringMVC之@InitBinder处理请求参数的绑定(一)

自定义异常处理:

springboot错误处理原理:

    1. SpringBoot 会自适应处理错误响应页面JSON数据
  • 2.** SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给boot进行处理**

静态异常页面:

动态异常页面:

动态页面模板,不需要开发者自己去定义控制器,直接定义异常页面即可 ,Spring Boot 中自带的异常处理器会自动查找到异常页面。
如果动态页面和静态页面同时定义了异常处理页面,例如 classpath:/static/error/404.html 和 classpath:/templates/error/404.html 同时存在时,默认使用动态页面。

自定义异常视图:

Custom Error Message Handling for REST API | Baeldung

解决跨域问题:

【精选】跨域请求被拒绝时,会进入后端接口执行吗? 对跨域有个全面的认知_跨域请求被拦截后怎么判断请求到达后端_Yionr的博客-CSDN博客(较长,有点废话)
1.所谓同源是指协议、域名以及端口要相同。

  • 浏览器的跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。
  • 所谓跨域是指浏览器当前访问的界面和请求的界面不是同一个源
  • 如果服务器没有配置CORS,则简单跨域请求可以成功执行,但是返回的内容会被浏览器拦截!
  • 当我们使用阿里OSS存储访问图片的时候,大都情况下是访问图片的请求是跨域请求;但是阿里云后端解决了跨域问题,所以访问前端可以直接访问图片,而不用处理跨域问题。
  • image.png

解决跨域问题:
Springboot处理CORS跨域请求的三种方法_springmvc 中的请求转发 重定向 导致 cors-CSDN博客
法1:

1
2
3
4
5
6
7
1.可以通过@CrossOrigin注解配置某一个方法(contrller类)接受某一个域的请求,
@CrossOrigin(value = "http://localhost:8081")
@GetMapping("/hello")
public String hello() {
return "hello";
}表示hello方法将解释来自http://localhost:8081的请求。也就是说该方法可以接受不属于自己域的值
如果该注解修饰的是一个controller类,那么表示该控制器的所有方法将可以接受不属于自己域的请求。

法2:全局配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://localhost:8081")
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(30 * 1000);
}
}
//1.registry.addMapping("/**")表示将控制器所有的方法都映射到跨源处理当中,也就是说控制器的所有
// 方法都可以处理来自不同域的请求;
// 2.allowedOrigins表示该控制器允许处理的其他域;
// 3.allowedMethods("*")是允许处理所有的请求方法,也就是get,put等等
//4. 可以这样思考:一个请求包括请求地址,请求方式,请求头;所以在addCorsMappings方法中要分别
// 对他们进行处理。

image.png

1
2
3
4
5
6
7
8
9
这里的.maxAge(30 * 1000)方法的含义是设置预检请求的响应可以被客户端缓存的时间,单位是毫秒。
这样,如果客户端在这个时间内再次发送相同的预检请求,就不需要再次询问服务器,而是直接使用缓存
的响应。这可以提高性能和效率。
预检请求是一种特殊的OPTIONS请求,用于在跨域请求之前检查服务器是否允许该请求。预检请求会携带一些
特定的头信息,如Origin, Access-Control-Request-Method, Access-Control-Request-Headers等,
以告知服务器客户端的请求信息。服务器会根据这些信息返回一个响应,包含一些CORS相关的头信息
,如Access-Control-Allow-Origin, Access-Control-Allow-Methods
, Access-Control-Allow-Headers等,以告知客户端是否允许该请求。

自定义系统启动定时任务:

1.往spring容器中注入实现CommandLineRunner接口的bean.并重写run方法。

1
2
3
4
5
6
7
8
9
10
@Component
//oredr代表的启动顺序,数字越小启动越早
@Order(98)
public class MyCommandLineRunner2 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("MyCommandLineRunner2>>>"+Arrays.toString(args));
}
}

  1. 首先通过 @Compoent 注解将 MyCommandLineRunner1 注册为Spring容器中的一个 Bean。
  2. 添加 @Order注解,表示这个启动任务的执行优先级,因为在一个项目中,启动任务可能有多个,所以需要有一个排序。@Order 注解中,数字越小,优先级越大,默认情况下,优先级的值为 Integer.MAX_VALUE,表示优先级最低。
  3. 在 run 方法中,写启动任务的核心逻辑,当项目启动时,run方法会被自动执行。
  4. run 方法的参数,来自于项目的启动参数,即项目入口类中,main方法的参数会被传到这里。

其中启动项目参数的设置:
image.png
另一种方式,则是将项目打包,在命令行中启动项目,然后启动时在命令行传入参数,如下:

1
java -jar devtools-0.0.1-SNAPSHOT.jar 三国演义 西游记

2.实现ApplicationRunner
ApplicationRunner 可以接收更多类型的参数(ApplicationRunner 除了可以接收 CommandLineRunner 的参数之外,还可以接收 key/value形式的参数)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
@Order(98)
public class MyApplicationRunner1 implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
List<String> nonOptionArgs = args.getNonOptionArgs();
System.out.println("MyApplicationRunner1>>>"+nonOptionArgs);
Set<String> optionNames = args.getOptionNames();
for (String key : optionNames) {
System.out.println("MyApplicationRunner1>>>"+key + ":" + args.getOptionValues(key));
}
String[] sourceArgs = args.getSourceArgs();
System.out.println("MyApplicationRunner1>>>"+Arrays.toString(sourceArgs));
}
}

当项目启动时,这里的 run 方法就会被自动执行,关于 run 方法的参数 ApplicationArguments ,我说如下几点:

  1. args.getNonOptionArgs();可以用来获取命令行中的无key参数(和CommandLineRunner一样)。
  2. args.getOptionNames();可以用来获取所有key/value形式的参数的key。
  3. args.getOptionValues(key));可以根据key获取key/value 形式的参数的value。
  4. args.getSourceArgs(); 则表示获取命令行中的所有参数。

ApplicationRunner 定义完成后,传启动参数也是两种方式,参数类型也有两种,第一种和 CommandLineRunner 一致,第二种则是 –-key=value 的形式
或者使用 如下启动命令:

1
java -jar devtools-0.0.1-SNAPSHOT.jar 三国演义 西游记 --age=99

image.png

整合Swagger2:

返回JSON数据:

image.png
@JsonIgnore
@JsonFormat

文件上传:

当个文件上传:

上传后实际文件的路径:
image.pngimage.png
上面的文件夹是服务器每次重启后都会新建一个。之前我做过一个项目是将上传头像的功能,上传的头像放在静态资源的路径下,但是每次上传成功后头像要系统重启后才能访问!会产生这种情况的原因是:静态资源在web访问启动后会被打包在target目录的class目录下。更新的头像更新了原静态文件夹的内容,但是这是没有更新class目录下的图片,只能重启重新打包在 class文件下。因为前端访问的静态资源是打包后class路径下的静态资源,而非服务器我们创建用来存放头像的静态资源。我们可以通过把头像放在上面tomcat生成的文件夹,从而实现文件的实时更新。
理解tomcat启动创建的文件夹:
上面的文件夹是web服务启动时,在temp目录下创建的。
SpringBoot设置tomcat临时文件目录必要性 - 马非白即黑 - 博客园
tomcat temp目录作用-掘金
文件上传form表单中的entype="multipart/form-data"的理解:
image.png
multipart是多部分的意思。
entype="multipart/form-data"是一种指定表单数据的编码方式,它可以让表单同时发送文本和二进制数据,比如文件、图片等。这种编码方式将表单数据分成多个部分,每个部分都有自己的头信息和内容,这样服务器就可以根据头信息来解析不同类型的数据1

配置类和XML:

拦截器:

image.png

整合Servlet,Filter,Listener:

路径映射:

配置AOP:

数据持久化:

JdbcTemplate:

mybatis:

【精选】使用tk-mapper(通用mapper)自动生成mybatis的mapper/实体/接口_mybatis tkmapper生成接口-CSDN博客

JPA:

nativeQuery = true是什么意思?_@query(nativequery = true_有翅膀的猫的博客-CSDN博客
Just a moment…

整合NoSql:

REST:

1.REST风格服务端不储存session,相关的信息要么要么通过客户端的token保存,要么保存在特点的redis中。

WebSocket:

SpringBoot + Vue 实现基于 WebSocket 的聊天室 - 掘金
image.png
STOMP 是一种简单的可互操作协议,设计用于通过中介服务器在客户端之间传递异步消息。它为这些客户端和服务器之间传递的消息定义了基于文本的有线格式。STOMP官方文档

1
2
3
4
5
6
7
Spring Boot提供了WebSocket的支持,可以使用@ServerEndpoint注解来标注一个类,
表示该类是一个WebSocket服务器端的处理器。在使用@ServerEndpoint注解时,
我们还需要为该处理器配置一个ServerEndpointExporter实例,以便能够将其发布到服务器中。

ServerEndpointExporter是一个Spring Bean,可以通过在配置类中添加@Bean注解来创建它的实例。
在创建ServerEndpointExporter实例时,我们需要注入ServerEndpointExporter所需的其他Bean
,例如ServerEndpointConfig和MessageConverter等。