1.创建
使用idea提供的脚手架创建springboot项目,选上需要的模块,会自动进行导包
打成jar包,之前直接用原生的maven打包的是一个瘦jar,不能直接跑,把服务器上部署的jar排除在外了,但是现在加上打包查件,打包是一个fat jar,安装了java环境,就可以输入命令java -jar [jar包名] 就可以跑起来了(内置了tomcat)
2.原理
1.依赖管理机制:
所有创建的项目是基于一个母模块,可以看到Pom中有一个parent,就是母包,这个依赖中有全部我们需要的依赖,以及对应版本。我们需要哪一块,只需要将start包引入即可,不用填v,母依赖已经做了版本,会自动导其版本。
Build Systems :: Spring Boot
2.自动配置机制
原理:
1.添加启动器 spring-boot-start-XXX
所有的start里面都有一个spring-boot-start,这个里面又有spring-boot-autoconfigure包,里面就是所有配置类。
2.主程序的注解@SpringBootApplication上面有三个注解
其中@EnableAutoConfiguration就是告诉springboot要把哪些类放到容器中
此注解上面有@Import({AutoConfigurationImportSelector.class}),即位置,具体位置是
spring-boot-autoconfigure
下
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
一共146个配置类 名字叫XXXAutoConfiguration
如,ServletWebServerFactoryAutoConfigurationbu
3.不是全部使用,会看你导入了哪些启动类,也就是看这个类在不在,在的话我就配置。
(用条件注解@ConditionalOnxxx实现
)
怎么配置?配置类有很多@Bean,会将配置文件的有关参数读入,然后配给这个bean
就实例化成功了。
3.最佳实践思路
1.添加启动器 spring-boot-start-XXX
2.查看对应的XXXAutoConfiguration类,看里面注册了什么bean,我们可以用什么
3. 写配置 可以查看此bean用了什么配置类,此配置类用的配置文件前缀叫什么 eg.@EnableConfigurationProperties(RedisProperties.class)
这里需要我们提供什么配置,配置名叫什么
我们想要修盖哪些默认配置,在配置文件中修改
我们想要自定义哪些配置,实现WebMvcConfigurer接口
4.使用:
需要用到这些注册好的bean,直接@AutoWried
如果对springboot自动创建放到容器的bean不满意,我们可以直接写个配置类在里面写一个自己的这个Bean,加上@Order配置优先级,就会覆盖了。
@Order
注解通常用于指定某些组件的执行顺序 core包的
4.具体使用
完整版 SpringBoot3-快速入门 · 语雀
1.配置文件格式变为yaml
可以将properties改为yaml格式,更清晰
person:name: 张三age: 18birthDay: 2010/10/10 12:12:12like: truechild:name: 李四age: 20birthDay: 2018/10/10text: ["abc","def"]dogs:- name: 小黑age: 3- name: 小白age: 2cats:c1:name: 小蓝age: 3c2: {name: 小绿,age: 2} #对象也可用{}表示
2.日志
SpringBoot怎么把日志默认配置好的
- 每个
starter
场景,都会导入一个核心场景spring-boot-starter
- 核心场景引入了日志的所用功能
spring-boot-starter-logging
spring-boot-starter-logging
导入了logback + slf4j
,所以作为默认底层日志组合日志是系统一启动就要用
,xxxAutoConfiguration
是系统启动好了以后放好的组件,后来用的。- 日志是利用监听器机制配置好的。
ApplicationListener
。
可以看到在spring-boot-autoconfigure包下,找到logging相关自动配置,没有xxxAutoConfiguration文件,都是监听器
- 日志所有的配置都可以通过修改配置文件实现。以
logging
开始的所有配置。
总结:日志是系统一启动就会打印的,是用监听器机制实现的
会读spring-boot包里的文件additional-spring-configuration-metadata.json配置日志格式
(日志是springboot很底层的东西,所以在spring-boot包下写的配置,其余系统已开启就有的东西,也会放到上述的文件中,如banner就是spring图标)
常见使用
日志所有的配置都可以通过修改配置文件实现。以logging
开始的所有配置。
1.修改输出格式 logging.pattern.console
可尝试修改为
'%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n'
还可以单独修改某一部分的格式,如logging.pattern.dateformat单独修改日期格式
2.修改日志级别
由低到高:ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF
;
只会打印指定级别及以上级别的日志
不指定级别的所有类,都使用root指定的级别作为默认级别
SpringBoot日志默认级别是 INFO,可以用logging.level.root修改
3.日志分组
将相关的logger分组在一起,统一配置。指定一些类的级别,不用root的级别了。
logging.group.mineGroup=com.yang.controller.test,com.yang.service.test
logging.level.mineGroup=debug
4.文件输出
SpringBoot 默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name or logging.file.path配置项。
如:logging.file.name=my.log 在项目底下出现my.log(路径D:\java\projects\springboot\my.log)
5.文件归档与滚动切割(防止打开log太卡了,文件太大)
归档:每天的日志单独存到一个文档中。
切割:每个文件10MB,超过大小切割成另外一个文件。
最佳实战
- 导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志
- 修改
application.properties
配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xml
,log4j2-spring.xml
- 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
- 业务中使用slf4j-api记录日志。不要再 sout 了
3.web启动器分析(spring-starter-web)
2、SpringBoot3-Web开发 · 语雀超详细解析)
前面原理说过了,自动导入以下web相关的AutoConfiguration类
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
====以下是响应式web场景和现在的没关系======
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration
================以上没关系=================
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
点进去每个自动配置类,都在里面注册了很多bean,然后有些bean上面绑定了配置类,配置类与配置文件绑定,有如下几个绑定的配置项。
- 1、SpringMVC的所有配置
spring.mvc
- 2、Web场景通用配置
spring.web
- 3、文件上传配置
spring.servlet.multipart
- 4、服务器的配置
server
: 比如:编码方式
分析WebMvcAutoConfiguration
静态资源访问
1.发送请求,用两个过滤器,将form表单发送的delete,put请求正确处理
2.DispatcherServle会分析此请求是否是静态资源路径,默认前缀为/**
3.如果是静态资源路径,会从存放静态资源的路径下查找,默认为
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
4.所有静态资源都定义了缓存规则。【浏览器访问过一次,就会缓存一段时间】,但此功能参数无默认值(静态路径在注册时,就会配置好缓存规则)
- cachePeriod: 缓存周期; 多久不用找服务器要新的。 默认没有,以s为单位
- cacheControl: HTTP缓存控制;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching
- useLastModified:是否使用最后一次修改。配合HTTP Cache规则,默认为true
5.还定义了欢迎页面,一开始打开就会走欢迎页,在上述静态资源路径下查找,没有就在 templates下找index模板页
6.浏览器访问资源后会自动发请求要favicon.ico,服务器在静态资源目录下找 favicon.ico
修改配置
所有的默认配置都可以自定义,配置方式有两种,1.修改配置文件 2.实现WebMvcConfigurer接口
以修改静态资源为例
1.修改配置文件
spring.mvc:修改静态资源的前缀
spring.web:修改静态资源路径 以及 缓存机制
server.port=9000#1、spring.web: # 1.配置国际化的区域信息 # 2.静态资源策略(开启、处理链、缓存)#开启静态资源映射规则 默认也是开启的 spring.web.resources.add-mappings=true#设置缓存 #spring.web.resources.cache.period=3600 ##缓存详细合并项控制,覆盖period配置: ## 浏览器第一次请求服务器,服务器告诉浏览器此资源缓存7200秒,7200秒以内的所有此资源访问不用发给服务器请求,7200秒以后发请求给服务器 spring.web.resources.cache.cachecontrol.max-age=7200 #使用资源 last-modified 时间,来对比服务器和浏览器的资源是否相同没有变化。相同返回 304 #浏览器规定刷新就一定要访问服务器,服务器返回最后一次修改时间,一致返回304还是走缓存 spring.web.resources.cache.use-last-modified=true#自定义静态资源文件夹位置 spring.web.resources.static-locations=classpath:/a/,classpath:/b/,classpath:/static/#2、 spring.mvc ## 2.1. 自定义webjars路径前缀 spring.mvc.webjars-path-pattern=/wj/** ## 2.2. 静态资源访问路径前缀 spring.mvc.static-path-pattern=/static/**
2.实现WebMvcConfigurer接口
这种修改方式,是保留所有springboot的默认参数。自己可以额外添加规则。这中方式很常用,就是springboot中没有此规则就实现此接口,写自己的方法。springboot默认资源从static找之类的,都是生效的。只要在容器中放WebMvcConfigurer组件就会生效,原理看雷神文章。
此接口的内容:
我们配制自己静态资源规则,就要重写addResourceHandlers方法。(仿照源码来写)
@Configuration //这是一个配置类 public class MyConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//保留以前规则//自己写新的规则。registry.addResourceHandler("/static/**").addResourceLocations("classpath:/a/","classpath:/b/").setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS));} }
我们也可以添加拦截器,首先实现一个
HandlerInterceptor
接口,接着用addInterceptors方法添加此拦截器。public class MainInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("我是处理之前!");return true; //只有返回true才会继续,否则直接结束}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("我是处理之后!");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//在DispatcherServlet完全处理完请求后被调用System.out.println("我是完成之后!");} }
@Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MainInterceptor()).addPathPatterns("/**") //添加拦截器的匹配路径,只要匹配一律拦截.excludePathPatterns("/home"); //拦截器不进行拦截的路径 }
访问controller层的原理
DispatcherServlet接收请求(默认支持两种:ant风格和restful风格)
会用起方法准备两个东西:
HandlerMethodArgumentResolver
:参数解析器,确定目标方法每个参数值HandlerMethodReturnValueHandler
:返回值处理器,确定目标方法的返回值该怎么处理
得到执行链对象,包括要执行的方法(Controller)和拦截器,之后执行拦截器的preHandle再执行Controller,执行完毕后会返回一个对象,之后执行拦截器的postHandle方法
紧接着,给返回对象找到一个合适的返回值处理器 HandlerMethodReturnValueHandler
之后执行处理的方法
- 如果标注了
@ResponseBody
注解,会找到一个能处理标注此注解的方法,找到对应消息处理器。有内容协商(2种方式),选择要求的处理器,如果有,返回即可;没有内容协商,默认json。 - 没标此注默认统一返回ModelAndView对象,走视图解析器,ViewResolver(视图解析器)将逻辑视图转为物理视图(加上前缀和后缀),返回一个视图对象,之后视图对象将内容转为html,对应消息转化器将html文件写入响应体,DispatcherServlet发给浏览器,完成渲染
最后执行拦截器的afterCompletion方法。
WebMvcAutoConfiguration提供几种默认HttpMessageConverters
ByteArrayHttpMessageConverter
: 支持字节数据读写StringHttpMessageConverter
: 支持字符串读写ResourceHttpMessageConverter
:支持资源读写ResourceRegionHttpMessageConverter
: 支持分区资源写出AllEncompassingFormHttpMessageConverter
:支持表单xml/json读写MappingJackson2HttpMessageConverter
: 支持请求响应体Json读写
WebMvcAutoConfiguration实现了WebMvcConfigurationSupport
WebMvcConfigurationSupport提供了很多默认配置,其中就有消息处理器添加的功能。
判断系统中是否有相应的类:如果有,就加入相应的HttpMessageConverter
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
所以导入jackon的xml包也就有了xml的消息转化器。在pojo类上加上
像yaml的格式,我们即使导入了转换包,也没有消息处理器,需要自己写一个。
内容协商
1.内容协商的两种方式:
1)Accept请求头,请求头要求什么格式返回什么格式,默认开启的
如:浏览器端
可以要的格式有这么多,优先text/html
像客户端,就会accpt就会是json优先
2)请求参数,需要开启【看雷神的文章去】
(格式如:application/json text/html ,也可以在springboot配置文件中自定义)
分析ErrorMvcAutoConfiguration
springboot的错误机制
SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给boot进行处理,boot就是转协商转错误页面还是其他格式到。
回顾springMVC错误机制:
在某个类中写方法并标注@@ExceptionHandler(处理的异常类型.class),此类中出现此异常,都会交给此方法来处理。
也可以设置全局异常处理器类,所有的类出现对应异常都会跑到此类执行对应方法。
方法参数可以接收Exception,打印异常信息。
@ControllerAdvice
@RestController
public class AllError {@ExceptionHandler(Exception.class)public String error(Exception e) {return "error"+e.getMessage();}
}
分析ServletWebServerFactoryAutoConfiguration和EmbeddedWebServerFactoryCustomizerAutoConfiguration
容器tomcat启动就是这两,启动后ioc容器会创建web工厂,默认有tomcat所以创建了tomcat服务器
- 修改
server
下的相关配置就可以修改服务器参数 - 通过给容器中放一个
ServletWebServerFactory
,来禁用掉SpringBoot默认放的服务器工厂,实现自定义嵌入任意服务器
web最佳实践
4.数据整合
1.导入mybatis-spring-boot-starter和mysql-connector-java
2.编写数据源配置
spring.datasource.url=jdbc:mysql://192.168.200.100:3306/demo
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
3.配置mybatis,如mapper文件位置,是否开启驼峰模式等,所有在mybaits配置文件中可配的都可配
#指定mapper映射文件位置
mybatis.mapper-locations=classpath:/mapper/*.xml
#参数项调整
mybatis.configuration.map-underscore-to-camel-case=true
4.使用时,要将mapper接口代理为实现类,可以用注解@MapperScan做扫包,或者将mapper接口上添加@Mapper注解
5.编写mapper文件或者添加注解
- 使用
mybatisx
插件,快速生成MapperXML
原理:
1.jdbc场景的自动配置:
mybatis-spring-boot-starter
导入 spring-boot-starter-jdbc
,jdbc是操作数据库的场景
有DataSourceAutoConfiguration,数据源的自动配置,读配置文件,默认数据源是HikariDataSource
有DataSourceTransactionManagerAutoConfiguration,支持事务
2.MyBatisAutoConfiguration
:配置了MyBatis的整合流程(在mybaits-spring-boot-starter包中)
数据源配置好后,会配置SqlSessionFactory和SqlSessionTemplate
(要用aop功能还要导入spring-boot-starter-aop包_)
认证/授权详解,JWT
Spring Security