• 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

  • 相关阅读:
    NC_100_ATOI NC_102_lowestCommonAncestor NC_104_COMPARE_VERSION NC_109_ISLAND_NUM
    Spring自动注入新写法
    NC_91_LONGEST_INCRE_SUBARRY NC_92_LCSII NC_93_LRU
    linux 下vsftpd安装使用
    IDEA Jrebel 激活方法
    Salieri
    长乐集训集合
    [学习笔记]Prufer序列
    [学习笔记]回文算法
    [学习笔记]基础字符串算法
  • 原文地址:https://www.cnblogs.com/luckyboylch/p/12327124.html
Copyright © 2020-2023  润新知