目录
依赖管理 关于各种的 start 依赖 关于自动配置 关于约定大于配置中的配置 SpringBoot 整合 SpringMVC 定制化 SpringMVC 静态资源处理 对上传文件的处理 对异常的处理 Web原生组件注入(Servlet、Filter、Listener) Interceptor 自定义拦截器 DispatcherServlet 配置映射路径 定制 内嵌的 服务器 定制化总结
依赖管理
每个刚创建的 SpringBoot 项目的 pom 文件都有spring-boot-starter-parent
依赖,然后它还有一个父依赖spring-boot-dependencies
spring-boot-dependencies
决定了 SpringBoot 项目的依赖版本,但是如果不遵循也是可以的,可以自己导入新的依赖版本如果遵循 SpringBoot 的版本,引入相应的依赖的时候,依赖的坐标就可以不标明版本号了
关于各种的 start 依赖
导入这些 start 依赖,就是导入了和这个 start 依赖 有关的组件的所有相关依赖,然后再通过 SpringBoot 的自动配置,做到开箱即用
关于自动配置
自动配置主要看 启动类 的注解 @SpringBootApplication
,其中最主要的是注解 @EnableAutoConfiguration
,这个注解又包含@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
包含@Import(AutoConfigurationPackages.Registrar.class)
,其中AutoConfigurationPackages.Registrar.class
的作用就是得到 启动类 所在的包路径,然后扫描包路径下的所有 类 ,该添加到容器的添加,不该添加的忽略@Import(AutoConfigurationImportSelector.class)
的关键就是AutoConfigurationImportSelector.class
,这个类是实现自动配置的主要入口,主要的逻辑顺序是org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations
>org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames
>org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories
经过上面的调用步骤,最终关键的就是classLoader.getResources("META-INF/spring.factories")
,所以实现自动配置,就是扫描引入依赖的类路径下的spring.factories
中的内容,这个文件中的类容就是各种配置类 随便点开一个自动配置类,就会发现各种@Bean、@Conditional、@EnableConfigurationProperties、@ConditionalOnMissingBean...
,这些注解就是自动配置的关键,满足条件就会注册到容器中,并且还会带默认的配置,这就是开箱即用,约定大于配置
关于约定大于配置中的配置
前面已经知道自动配置的来源就是各种自动配置类,以 SpringMVC 的相关的自动配置类 WebMvcAutoConfiguration 为例,可以观察到类似@EnableConfigurationProperties({WebProperties.class})、@ConditionalOnProperty( prefix = "spring.mvc.problemdetails", name = {"enabled"},havingValue = "true" )、@ConditionalOnProperty(prefix = "spring.mvc.formcontent.filter", name = {"enabled"},matchIfMissing = true)...
通过这样带有配置关键字的注解,可以发现要么在注解上就标明了配置内容和默认值,要么就是通过 xxxProperties 这样的类,其中内容也大多是如图所示的内容,可以发现就是一些配置文件里面的内容,如果没有配置也会有默认值
SpringBoot 整合 SpringMVC
定制化 SpringMVC
定制化功能,主要通过观察 SpringMVC 的自动配置类 通过实现 WebMvcConfigurer
接口作为配置类,添加自定义的功能 通过在配置类中 创建 HiddenHttpMethodFilter
的实例到容器,自定义 HiddenHttpMethodFilter
需要先开启配置spring.mvc.hiddenmethod.filter.enabled=true
在配置类上使用 @EnableWebMvc
意味着完全自定义 SpringMVC 相当于回到最原始的 web 程序开发
静态资源处理
静态资源处理,已经默认开启spring.resources.add-mappings=true
默认的静态资源路径如下,参照 自动配置类 WebMvcAutoConfiguration
引入了 webMvcProperties
的属性配置 自定义静态资源路径spring.resources.static-locations={ "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" }
自定义静态资源请求路径映射spring.mvc.static-path-pattern="/**"
,默认就是"/**"
让客户端缓存静态资源spring.resources.cache.period=10000
单位是s
对上传文件的处理
SpringBoot 默认已经配置好 文件上传需要的 依赖和配置 但是还是要设置文件的大小配置的
# 单个文件的最大限制
spring.servlet.multipart.max-file-size=10MB
# 整个请求的最大限制
spring.servlet.multipart.max-request-size=100MB
对异常的处理
对异常的处理,SpringBoot 已经有了默认的配置
直接 在静态资源路径 添加 错误码.html,如5xx.html,就对应5开头的错误码,比如500,这种方式利用了默认配置,改变的只是错误的展示页面,使用的是 DefaultHandlerException—>DefaultErrorViewResolver 直接 创建一个 名字是 ErrorController
的处理器,这种方式,错误的处理和页面跳转完全由开发者控制 直接 在配置类中 创建一个 ErrorAttributes
的实例,这种方式只是修改了错误的提示信息,依然还是使用 DefaultHandlerException—>DefaultErrorViewResolver 自定义实现 HandlerExceptionResolver 处理异常,可以作为默认的全局异常处理规则 @ControllerAdvice+@ExceptionHandler处理全局异常,底层是 ExceptionHandlerExceptionResolver 支持的
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler ( { ArithmeticException . class , NullPointerException . class } )
public String handleArithException ( Exception e) {
log. error ( "异常是:{}" , e) ;
return "login" ;
}
}
@ResponseStatus + 自定义异常,实际上是交给ResponseStatusExceptionResolver
处理,最终由 Tomcat 发送错误信息返回前端,只改变了错误信息,而且使用的是最原始的 Tomcat 错误页面
@ResponseStatus ( value= HttpStatus . FORBIDDEN, reason = "用户数量太多" )
public class UserTooManyException extends RuntimeException {
public UserTooManyException ( ) {
}
public UserTooManyException ( String message) {
super ( message) ;
}
}
Web原生组件注入(Servlet、Filter、Listener)
通过注解 @WebFilter、@WebServlet、@WebListener 通过 Servlet、Filter、Listener 它们的子类,然后在配置类中注册
Interceptor 自定义拦截器
自定义的拦截器,对于自定义的 servlet
不起作用,因为 拦截器起作用是建立在 DispatcherServlet 的代码逻辑上的 org.springframework.web.servlet.DispatcherServlet#doDispatch ---> org.springframework.web.servlet.HandlerExecutionChain#applyPreHandle
DispatcherServlet 配置映射路径
在 SpringBoot 中 DispatcherServlet
通过 DispatcherServletAutoConfiguration-->DispatcherServletRegistrationBean-->ServletRegistrationBean
完成注册到容器,使用的是 webMvcProperties
的属性配置 修改映射路径 spring.mvc.servlet.path="/"
,默认配置也是"/"
定制 内嵌的 服务器
程序启动会创建一个 web 版的IoC容器 ServletWebServerApplicationContext
,其逻辑是org.springframework.boot.web.embedded.xxxxx.xxxxServletWebServerFactory#getWebServer<---org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#getWebServerFactory<--ServletWebServerFactory
xxxx
就是下面步骤获得的服务器工厂的服务器名org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration--->org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration-->根据导入的依赖决定是那种服务器的 ServletWebServerFactory
其中服务器工厂的自动配置类,决定了我们对服务器的个性化配置的方式,要么修改配置文件ServerProperties
、要么模仿 ServletWebServerFactoryCustomizer
实现 org.springframework.boot.web.server.WebServerFactoryCustomizer#customize
SpringMVC 的 start 默认是导入 Tomcat 依赖的,如果想要换服务器,应该先排除 Tomcat 依赖,再导入其它服务器的依赖
定制化总结