SpringBoot学习

推荐使用的markdown编辑器 Typora(可以边编辑边实时显示)
 
建议直接通过IDEA来创建Spring Initializer,再选择对应的java版本和springboot依赖即可。
 
指定tomcat端口运行:
方法1:通过java命令执行jar包时,制定tomcat端口:java -jar xxx.jar --server.port=8080
方法2:找到main方法所在在启动aplication.java文件,Edit Configurations -》 VM options -> -Dserver.port=8082 (优先级最高)
方法3:打开包目录下的resources/application.properties,添加server.port=8083,然后重启项目即可.(优先级次高)
 
将一个包打成可执行jar包方法:Maven->demo->Lifecycle -> 双击package即可。
执行jar包:java -jar xxx.jar即可
 
IDEA代码片段快捷输入:https://www.okcode.net/article/40625
 
 
=================== 遇到的常见问题:
Maven plungs clean 错误
原因:maven配置文件和maven安装路径不符合
解决:settings-> Build Tools 重新指定下maven的各路径即可。
 
idea中dependencies中总是有红色波浪线:
解决:注释掉pom.xml中的依赖部分,再释放即可。
 
有时需要重新加载maven包或项目:
打开当前包的pom.xml文件,右键 -> Maven -> Reimport;
或直接点开右上角 Maven按钮,Reimport All Maven Projects
 
pom.xml的bulid部分中的<artifactId>spring-boot-maven-plugin</artifactId>报红(即not found):
原因:maven未配置 / 下载的spring-boot-maven-plugin存在多个版本导致maven获取时版本冲突
解决:配置maven / 找到repository仓库下的orgspringframeworkootspring-boot-maven-plugin目录并删除,然后重新加载项目即可。
 
Spring的filter中无法@Autowired接口的解决方案:
 
service手动实例化(new)导致类中的spring对象无法注入的问题解决:
使用@service注解的类不允许使用new创建类实例,否则@Autowired注入@service修饰的类时会是空指针
同时,若类A中@Autowired依赖注入了类B实例,则类A也不允许使用new创建类实例,否则成员类B实例也是空指针。
 
驼峰命名法的成员变量,类序列化和反序列化JSON时,为避免出错需要在类定义前加上以下注解:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
 
IDEA全局搜索Ctrl+Shift+F无效:
方法1:搜狗输入法繁简切换占用导致,设置->高级->快捷键->系统功能快捷键->取消繁简切换即可
方法2:修改全局搜索的快捷键,IDEA 设置 -> Keymap -> 搜索Find -> 找到Find in Path 双击
 
Maven包版本冲突解决办法:
使用Maven Helper工具排除多余版本的包时,Refresh UI;对于找不到的类可能需要鼠标放到报错上,点击add Classpath
 
 
调试模式下移除IDEA所有断点:https://blog.csdn.net/yanziit/article/details/73459795
 
IDEA回到上次代码浏览位置:Ctrl+alt+左箭头/右箭头
 
Ctrl+Alt7:查引用
Ctrl+N:查类名
Ctrl+F12:查当前类的所有函数
断点右键:可以添加条件(java代码形式)来让满足某种条件(变量等于某个值)才停在该断点. 
F9:跳到下个断点
F8:跳到下个函数
修改代码需要重新执行应用
Ctrl + J:查看代码快捷输入
双击shift搜文件
Alt + Enter:添加类/方法注释
 
Spring重试机制:
 
 
 

YAML语法:

yml/yaml:以数据为中心,比json、xml等更适合做配置文件(没有开闭标签); 但properties文件的可读性更好

1、基本语法

  • k:(空格)v:表示键值对(空格必须有)
  • 以空格的缩进来控制层级关系
  • 属性和值大小写敏感
server:
  port:8081
  path: /hello

2、值的写法

  • 字面量:普通的值(数字、字符串、布尔)字符串默认不用加上单引号或双引号;双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思(即 会变成换行)单引号:会转移特殊字符,即 会直接输出 而不会打印换行
  • 对象、Map(属性和值)
friends:
  lastname: zhangsan
  age: 20

行内写法:

friends: {lastname: zhangsan, age: 18}
  • 数组(List、Set)用-表示一个元素
pets:
  - cat
  - dog
  - pig

行内写法:

pest: [cat,dog,pig]

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是方法名
   @Bean
   public HelloService helloService2(){
       System.out.println("配置类@Bean给容器中添加组件");
       return new HelloService();
  }
配置文件中的占位符

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:
  port: 8081
  spring:
    profiles:
      active: prod

  person:
    last-name: hello
    age: 18
    boss: false
    maps: {k1: v1, k2: 12}
    dog:
      name: 小狗
      age: 12

  ---
  server:
    port: 8083
  spring:
    profiles: dev

  ---
  server:
    port: 8084
  spring:
    profiles: prod

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级别;

日志输出配置
如何让系统中所有框架的日志都统一到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

@Deprecated 表示此方法已废弃、暂时可用,但以后此类或方法都不会再更新、后期可能会删除,建议后来人不要调用此方法。

7、@PostConstruct与@PreDestroy

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行。PreDestroy()方法在destroy()方法知性之后执行

AOP自定义注解失效:

可能原因1:类内调用。当在被代理对象的方法中调用被代理对象的其他方法时,其实是没有用代理调用,是用了被代理对象本身调用的。尽量不同类间方法调用(多层注解均会生效),同类间调用只有最上层注解会起作用。

可能原因2:AOP注解并未生成Bean,比如@Autowired、@Resource注解的成员对象都是空指针。

详见:https://www.jianshu.com/p/e130b5b73c1b

 

统一处理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的使用:

此注解用于属性上,作用是把该属性的名称序列化为另外一个名称

详见:https://www.cnblogs.com/winner-0715/p/6109037.html

原文地址:https://www.cnblogs.com/luckyboylch/p/12327124.html