@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
YAML语法:
yml/yaml:以数据为中心,比json、xml等更适合做配置文件(没有开闭标签); 但properties文件的可读性更好
1、基本语法
- k:(空格)v:表示键值对(空格必须有)
- 以空格的缩进来控制层级关系
server
2、值的写法
- 字面量:普通的值(数字、字符串、布尔)字符串默认不用加上单引号或双引号;双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思(即 会变成换行)单引号:会转移特殊字符,即 会直接输出 而不会打印换行
- 对象、Map(属性和值)
friends
行内写法:
friends
- 数组(List、Set)用-表示一个元素
pets
行内写法:
pest
Springboot基础
@ResponseBody放在类开头前面:这个类的所有方法返回的数据直接写给浏览器(如果是对象转为json数据).@ResponseBody和@Controller可以被@RestController一个替换.
resources目录结构:
- static:存放静态文件(eg:js、css文件)
- templates:存放模版文件
- application.properties/application.yml:全局配置文件,修改springboot自动配置的默认值
自动注入配置:
@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关在配置进行绑定(默认从配置文件中获取值); prefix = "person":配置文件中哪个下面的所有属性进行一一映射。只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,即必须加到@Component里.在pom.xml中添加ConfigurationProperties对应的插件后,需要重新运行springboot程序才能生效.这样在编写yml配置文件时, 会有提示。${person.name}获取值;#{12*2}计算表达式。
@Value与@ConfigurationProperties区别:
@Value需要一个个指定,支持表达式计算,不支持JSR303数据校验, 不支持复杂类型封装即无法获取其值; eg: @Value("${person.name}")@ConfigurationProperties能批量导注入配置文件中的属性, 支持松散语法, 但不支持比表达式计算,支持数据校验, 支持复杂类型封装。
使用场景:
- 如果只是某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
- 如果专门编写了一个javaBean来和配置文件进行映射,直接使用@ConfigurationProperties
@PropertySource 与 @ImportResource
@PropertySource:加载指定的配置文件eg:@PropertySource(value = {"classpath:person.properties"})@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效eg:@ImportResource(locations = {"classpath:beans.xml"})标注在配置类上
SpringBoot推荐给容器中添加组件的方式:推荐使用全注解方式
1、配置类 ===== Spring配置文件(创建方式:XML Configuration File -> Spring Config)2、使用@Bean给容器添加组件
//将方法的返回值添加到容器中: 容器中这个组件默认的id是方法名
配置文件中的占位符
1、随机数
${random.value}、${random.int}、${random.int(10)}
2、占位符获取之前配置的值,如果没有可以用:指定默认值
person.last-name=张三${random.uuid}
person.dog.name=${person.hello:hello}_dog
Profile
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境1、多profile文件形式: - 格式:配置文件名命名成 application-{profile}.properties - eg: application-dev.properties2、多profile文档块形式: yml支持多文档块形式:---单独一行表示一个文档块
server
3、激活方式: * (多profile文件形式)主配置文件中指定 spring.profiles.active=dev * 命令行 --spring.profiles.active=dev (优先级高于配置文件中的指定,但也会形成互补配置) 方式1:edit Config -> Program arguments -> --spring.profiles.active=dev 方式2:java -jar demo.jar --spring.profiles.active=dev 语法:--配置项=value * jvm参数 -Dspring.profiles.active=devedit Config -> VM options -> -Dspring.profiles.active=dev
配置文件加载位置springboot启动会自动扫描以下位置的aplication.properties或者application.yml文件作为Springboot的默认配置文件:-file(项目目录的根目录下的config,即config与src同目录):./config-file(项目目录的根目录下):./-classpath(classpath指rsources目录下的config目录):/config/-classpath:/优先级由高到低; Springboot会加载以上四个位置的配置文件,会形成一种互补配置效果,但高优先级会覆盖低优先级的配置。
# 配置项目的访问路径
server.servlet.context-path=/boot02
# 浏览器发送hello请求的真实路径需要是127.0.0.1:8080/boot02/hello
可以通过sprin.config.location来改变配置文件的位置:项目打包好后,可以通过命令行形式来指定加载的配置文件位置,但指定加载的配置文件和默认加载的配置文件会同时起作用,满足前面的规则。eg: java -jar demo.jar --sprin.config.location=G:/application.properties
外部配置加载顺序
- 由jar包外向jar包内进行查找(即通过命令行指定的配置优先级高于通过配置文件指定的)
- 打包只会打包src目录下的配置,不会打包与src同级的目录config;
- jar包外的配置文件即指src同级的config中的配置文件.若拷贝配置文件到与jar包同级的目录中,则该配置文件也是jar包外部的配置文件,最先生效.
- 优先加载带profile的配置文件
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- 再来加载不带profile
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
spring-boot-autoconfigure.jar/META-INF/spring.factories文件:包含Springboot启动时加载的所有自动配置类,每个自动配置类EnableConfigurationProperties使生效的properties类定义了能配置的属性值。自动配置类添加组件(@Bean)时,会从properties类中获取某些属性,就可以在配置文件中指定这些属性的值(因此无需查官网).
@Conditional派生注解(Spring注解版原生的@Conditional作用)作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置类里面的所有内容才会生效.
可以能过在配置文件中启用debug=true属性(开启Springboot的debug),来让控制台打印自动配置报告,获取哪些自动配置项生效了(Positive matches),以及没启用的配置类(Negative matches)。
日志框架的使用
SLF4j只是日志实现框架的抽象层;logback、log4j等均是日志实现类,实际调用时应使用抽象层的方法,但配置文件还是做成日志实现框架的配置文件;Springboot使用slf4j和logback来提供日志功能,springboot能自动适配所有的日志框架,引入其他框架的时候,只需要把这个框架的日志框架排除掉;Spring框架用的是commons-logging日志框架Springboot默认已经配置好了日志框架日志级别:trace < debug < info < warn < error,Springboot默认使用的Info级别;
日志输出配置
- 可以调整日志输出级别:在全局配置文件中定义logging.level.com.example = trace;
- logging.path="/spring/log" //指定日志目录:在当前磁盘下的根目录下生成日志目录spring/log/, 使用spring.log作为默认的日志文件.
- logging.file="" //若不指定路径,则当前项目下生成log日志文件
- logging.pattern.console="" //在控制台输出日志的格式
- logging.pattern.file ="" //在文件输出日志的格式
- 指定日志配置文件放在classpath目录下:参见官网https://docs.spring.io/spring-boot/docs/2.1.10.RELEASE/reference/html/boot-features-logging.html#boot-features-logging-format
- logback.xml:直接被日志框架忽略;
- logback-spring.xml:日志框架就不直接加载日志的配置项,由Springboot解析日志,可以使用Springboot的高级的profile功能; 否则会报错
https://docs.spring.io/spring-boot/docs/2.1.10.RELEASE/reference/html/boot-features-logging.html#boot-features-logging-format
如何让系统中所有框架的日志都统一到slf4j:
- 1、将系统中其他日志框架先排除出去
- 2、用中间包来替换原有的日志框架,即将其它日志框架转成slf4j
- 3、我们导入slf4j要用的日志实现
- 如果要引入其他框架,一定要把这个框架的默认日志依赖移除掉,否则可能会存在日志jar包冲突
IDEA使用
- alt + insert:调出get、set代码快捷插入所有属性对应的方法,以及类的其他常用方法
- properties配置文件编码问题(支持中文):
- File Encodings -> Properties Files -> UTF-8,勾上Transparent native-to-ascii conversion
- File Encodings -> Global Encoding -> UTF-8
- 右键java文件 -> Copy Reference: 可以复制类的完事包路径
- 输入pbvm,直接插入main函数代码体; 输入syso,插入打印代码
- 全局搜索类名:Ctrl+n
- 查看项目的依赖结构图:
- 打开pom.xml右键 -> Diagrams -> Show Dependencies
- 若想要排除某个jar包,直接可依赖结构图中该依赖包的方框右键该包excldue即可.
- 调出所有可以缩写的代码片段
- Ctrl + P/Q 查看方法提示/查看方法声明
- Ctrl + O/I 调出所有需要重写/实现的方法
- 鼠标选中代码,然后Ctrl+alt+t把代码放在需要的代码块中
- Ctrl+E 最近访问的文件列表
- Ctrl+shift+/ 以代码块形式注释/反注释
- Ctrl+/ 以代码行形式注释/反注释
- Ctrl+w 连续按可以选中更外层的代码块
- 在某个地方Ctrl+C复制了文件,直接在idea想要拷贝到的目录下Ctrl+V即可实现拷贝,而无需手动打开对应的目录
- Ctrl+Shift+F 全局搜索
常用的注释:
1、@RestController 与 @RequestMapping:
- @Controller标识该类是一个Controller处理器,用来创建处理http请求的对象;
- @ResponseBody用来配合@Controller将返回的响应转成json格式;
- @RestController=@Controller+@ResponseBody,因此只需要配置一个@RestController即可完成前面两者的功能.
2、@ResponseStatus:
一般用于异常抛出时,修改响应默认返回的状态码.详见:https://www.cnblogs.com/lvbinbin2yujie/p/10575101.html
3、@Autowired:
需要调用Service类(接口的实现以@service注释)的实例时,利用@Autowired自动装配.详见:https://www.jianshu.com/p/9062a92fbf9a
4、@Bean
Bean可以理解为Spring容器中的组件,@Bean放在方法前面,表示生成一个组件类的实例(组件)并放入容器中,然后就可以通过@Autowired等注解依赖注入该组件实例。详见:https://blog.csdn.net/github_34606293/article/details/78868945
4、@ComponentScan
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中;自动扫描路径下带有@Controller,@Service,@Repository,@Component注解加入spring容器. 原来需要@Bean注解一个定义方法返回一个实例.详见:https://segmentfault.com/a/1190000015967862
5、@requestMapping
使用:https://blog.csdn.net/jaryle/article/details/72965885四种常见的 POST 提交数据方式:https://imququ.com/post/four-ways-to-post-data-in-http.html若不指定consumes,PathVariable中的参数会生成JSON字符串发送; 若不指定produces默认响应会以JSON字符串返回.MULTIPART_FORM_DATA_VALUE一般是POST请求上传文件时用到.
6、@Deprecated
统一处理Controller抛出的异常注解@ControllerAdvice:
作用:1. 全局异常处理 2. 全局数据绑定 3. 全局数据预处理
https://blog.csdn.net/kinginblue/article/details/70186586
https://blog.csdn.net/w372426096/article/details/78429141
https://juejin.im/post/5cb95001e51d456e63760476
https://zhuanlan.zhihu.com/p/63243681
https://juejin.im/post/5d791f6e5188255de7351fe9
@RequestMapping 注解详解:
https://juejin.im/entry/59bb7a8f5188256bd871dc15
Filter、FilterChain、FilterConfig 介绍:
https://www.runoob.com/w3cnote/filter-filterchain-filterconfig-intro.html
GET请求是否可以使用@RequestBody?
针对这种场景推荐将GET请求改为POST请求,更合规范.
https://blog.csdn.net/qq_28411869/article/details/81285810
https://blog.csdn.net/w605283073/article/details/86653699
https://www.jianshu.com/p/4981911d5e15
加上@Component、@Service等组件注解的类,可通过@Autowired注解注入到其他类(前提:不能new其他类)
若想在服务器启动后且构造函数之后执行一些操作,可以在@Component注解的类中定义@PostConstruct注解的函数(服务启动后只会执行一次,作用类似于静态变量的初始化,因此可以用于初始化静态变量)
@JsonProperty的使用:
此注解用于属性上,作用是把该属性的名称序列化为另外一个名称