Springboot

关于配置文件的顺序 (从外面到 里面 外面优先)

application.properties文件

首先 先找工作目录 的config文件

按照 顺序 首先级 最高 的 是 根目录下的config文件

1.工作目录下

2.项目的根下 模块的

3.项目内的 根

4.包下 的配置文件

底层:同时找 properies 和 yml 如果在 1中 同时都找不到 ,那就才会向下一级中去找

用values 注解 来取 配置文件 的值

比如有一个属性 通过注入 @values("key")

使用 ${"填好" }

实际开用yaml 或 yml

1.可以表达 复杂的数据结构

2.可读

数据交换用json多 yaml

yaml的语法格式

1.使用#注释 values不允许 重复

2.大小写敏感

3.使用单引 号 和 双引号 的区别 (单引号:如果\n 那么不换行 如果是双引号 : \n将会换行 )

也就是说 单引号不会转义 双引号会转义

4.如果不写 字符串 那就效果跟单引号一样

5.如果想要保持原格式 就需要添加 |

6.关于大于号 > 会将内容里面的换行 换成 空格

7.---- 三个横线 下面的配置 是一个庞大的文件

配置方式 : name:空格属性 age: name

1.age:20 age:true age : 数组 list map

比如:

phones:

-123

-2356

-456

换行加 空格 表示层级关系

A

B:a

关于properties 和yml文件的合并

1.当两个文件内容 都有的话 peoperties优先 如果内容不全 就相互补充

2.在主文件中 引入 其他的 配置文件 spring-config-import:classpath:xxxx,calsspath:xxx

复制代码
spring.config.import=classpath:application-mysql.properties,classpath:application-redis.properties

3.使用yml文件 引入其他yml文件也是一样的

复制代码
spring:
  config:
    import:
      - classpath:application-mysql.yml
      - classpath:application-redis.yml

4.一般情况下 spring - config- import 一般不用自己写

5.多环境切换:使用 spring.profiles.active=xxx或者yyy

文件名为 ;application-xxx 或者 yyy 这样就可以

绑定简单的bean的属性

  1. 在配置文件里面 写 a.b= name

  2. a.c=password

  3. 试图用@ConfigurationProperties(prefix="a")

@Configuration配置类

1.一般比较容易读

2.配置类 尽量使用这个 可读

3.单独使用 这个注解 底层会创建代理对象

4.在注解内 加一个false ,(proxyBeanMethod= false)就是这个 底层将不是代理对象了。如果使用代理 可以保证是单列的 如果不是代理 不能保证

5

嵌套bean

1.比如有一个Custorm 和 Address类 ,在custorm中 有一个 address属性 这个就是嵌套

在配置文件中 : 可以在address属性中 写 address中的属性

复制代码
app:
  info:
    age: 20
    name: jack
    adress:
      city: aa
      county: asd

ConfigurationPropertiesScan

  1. 使用这个注解 就可以把 component 去掉了 然后加上 configurationproperties

2.任意一个都行,要求写到主入口类上

关于list map 数组 array 的yaml文件的写法

list和数组 :

复制代码
# 数组
customers:
  - customer-name: jack
    age: 20
  - customer-name: lucy
    age: 30
# map
customer-map:
  customer1:
    customer-name: tom
    age: 20
  customer2:
    customer-name: jerry
    age: 30
# list(写法和数组一样)
customer-list:
  - customer-name: joke
    age: 30
  - customer-name: susan
    age: 40
    
    #数组
names:
  - jackson
  - lucy
  - lili

每一个数据用 - 号分割

-a

-b

-c

配置绑定到第三方对象

lombok的用法

1.@Data注解 生成get和set 和 equls 和

2.如果使用exclude 是除了什么什么 其他都带

@Tostring(exculude={"id"}) 除了id 其他都生成

@values注解 属性会加final ,并且提供get方法,不提供set方法,通过这个注解可以创建不可变对象。

@slf4j 注解

现在一般是使用logback

mybatis逆向工程

使用 工具 free mybatis tool 工具 插件

1.实体类

2.mapper接口

3.Mapper的xml文件

也就是生成这三个

自动配置

1.默认的bean有59个 就是 调用getbeanDefinit

2.当添加了springmvc启动器之后,会多几十个bean

3.所以说 springboot 的两大优势:

4.自动配置 按需加载 也是在properties文件或者yml 文件里面写,会覆盖默认的配置

5.按需加载,通过条件判断,注解 。当条件用,然后层级判断,最后留下需要的,通过反射,拿到类上的注解,有注解,就可以做某个事情 这不就是判断吗

条件注解 Configuration

miss是不存在

on是存在

就是哪个类.class 就是哪个类存在 或者不存在 才创建 或者不创建

复制代码
● @ConditionalOnClass:当指定的类存在时,才创建Bean。
● @ConditionalOnMissingClass:当指定的类不存在时,才创建Bean。
● @ConditionalOnBean:当容器中存在指定的Bean时,才创建Bean。
● @ConditionalOnMissingBean:当容器中不存在指定的Bean时,才创建Bean。
● @ConditionalOnProperty:当配置文件中存在指定的属性时,才创建Bean。也可以设置属性值需要匹配的值。
● @ConditionalOnResource:当指定的资源存在时,才创建Bean。
● @ConditionalOnWebApplication:当应用程序是Web应用时,才创建Bean。
● @ConditionalOnNotWebApplication:当应用程序不是Web应用时,才创建Bean

自动配置类的三个来源

1.springboot的官方自动配置类,不能随意放,在:spring-boot-autoconfigure.jar 的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 配置中。

2.第三方的配置类,也要放在springboot的那个特定的位置,也不能随意放

3.不管来源是哪个 ,位置都是一样的。

加载机制

从三个地方,把所有的配置全部拿过来,假设有100个,然后通过层层循环,每次拿一个,通过条件注解,看看是否满足所有条件,只有所有条件都满足,才配置生效,通常只有20-30个 有效

springboot官方提供了150多个,

核心方法讲解

1.首先 获取 注解上的属性,程序员要排除的 一些 注解

2.获取导入的注解的全限定类名

3.去重,将三方的所有注解 融合在一起,然后防止有重复的

4.收集排除的,获取候选的注解,将程序员不要动,获取的注解的名称,然后得到所有候选 ,满足条件的

5.检查已经排除的类,验证排除的 是否为确实是自动配置类,防止排除错

6.这一步才 排除,排除所有的

7.条件过滤,(最核心的一步)

引入--条件过滤器

条件过滤器

8.先获取所有的过滤器,springboot内置了3个过滤器

9.过滤器也会循环,每个过滤器循环一次

10.914个条件 ,用过滤器,将156个配置类 匹配条件,

11.过滤器 会判断三次 判断 是否有false,如果有但凡一个false 就会排除

12.然后就会循环

web中 核心配置 10个

关于WebMvc配置

1.如果配置想修改,那就在properties或者yml文件中 去改,就会覆盖原来的配置

2.如果是扩展的话,那就实现webmvcConfiguter接口的方法,去实现方法 就行了

3.牢记 不能写EnableWebMvc 就会springboot的配置失效。所以不推荐

WebMvc自动配置生效后引入两个filter bean

关于webjars静态资源处理

使用webjars。org 网站找坐标,

在web

静态资源 找 webmvcAutoConfiguration 这个类 里面有 staticpah

四个位置 ;够我们用了 static 够用了 springboot给我们生成的

内容协商时 可以加一个配置 之前使用format 改完就可以用type

1.json 和 xml

传统的web应用和 前后端分离

1.前后端 都要成为一个系统 都是独立的

2.vue做了双向 数据绑定 vue最大 的功劳 就算 不用 操作dom元素了...

springboot整合thymeleaf

1.首先 引入依赖,thymeleaf的依赖

2.直接写在templates文件夹就可以了

3.然后写controller类,返回值就返回 视图名

4.底层会自动拼接,

springboot 的异常 处理

1.springmvc的异常优先级比较高

2.全局异常 统一响应

3.提高健壮性

当springmvc处理不了,springboot异常才会处理

。/error 是白标页面 ..就算error的处理结果,就算那个浏览器 显示错误的页面

自适应的 是springboot提供 的

局部异常

在controller中 写一个异常的处理注解 方法上有一个注解:@ExceptionHandle

局部的异常 优先级比较高,是springmvc的局部的异常

全局异常处理@RestControllerAdvice+@ExceptionHandler

如果有全局的 有局部的 那就局部的优先

当springmvc没有处理的 spring boot 才会处理

springboot 的日志 级别是 info

1.开发 一般是 warn级别 ,如果太细 会影响 效率

2.springboot 不支持 falal 致命错误

3.debug适合 开发 阶段

4.生产环境适合用warn 或者info

logging.level.root = DEBUG

1.root影响的是全局的 所有的包 所有的文件 ,

2.如果 给否个类上 配置了 日志级别,那么在配置文件里面 的将不会起作用

复制代码
logging.level.root=WARN                     # 全局默认WARN
logging.level.com.jkweilai.service=INFO     # 明确指定service包为INFO
logging.level.com.jkweilai.service.OrderService=DEBUG # 明确指定该类的日志信息要更加详细

一般全局的级别 高一点 然后特定的搞低一点 可以查看更详细一点,

一般都是这样

日志分组

longging.level.root=debug

longging.level.组名=debug

longging.level.包名=debug

longging.level.类名=debug

设置某个 级别

如果不使用组:longging.level.(com.jikeweilai.bank)=debug

怎么定义组

spring.logging.group.组名(随意) = com.jikeweilai.bank , com.jikeiweilai.user

内置组 web组 和 sql组

日志级别的查找优先

1.先看类上有没有

2.类上没有 看包上的

3.包上有没有,

4.看组上有无

5.最后才是root

定时任务Spring Task 定时任务(一般够用开发 )

1.在入口启动用@EnableScheduling

2.在一个类上 用

复制代码
@Component
public class MyTask {
​
    // 指定定时任务:每隔5秒执行一次任务,以固定周期方式执行。
    @Scheduled(fixedRate = 5000)
    public void doTask() {
        System.out.println(LocalDateTime.now());
    }
}

springboot的异步方法的作用

1.需要自己指定一个线程池

2.启动异步方法

本质:让方法调用立即返回,实际执行交给线程池异步完成

在主入口加上;::: @EnableAsync

在需要指定异步的方法上加上 @Async(线程池的id)

异步方法 必须是public的

同类内部调用 则不生效,也就是this调用的 异步方法 实现代理

Bean Validation是什么

不属于springboot的内容

1.前端要检验数据

2.后端还是需要校验,一般写在dto上,对属性进行校验,加上注解,比如@NoEmpty不能为空

复制代码
    @NotNull  ==> //不能为null,可以是空字符串
    @NoEmpty  ==> //不能为空,trim去除后不能为空
    @Size(min=2, max=30)
    private String name;
    
    @Email
    private String email;
    
    @Min(18)
    private int age;

@Valid

1.如果报错 会自动抛出异常

复制代码
    @PostMapping("/createUser")
    public UserCreateDTO createUser(@Valid @RequestBody UserCreateDTO userCreateDTO) {
        // 校验失败不会走到这里
        return userCreateDTO;
    }

Knife4j

id自增的线程安全

复制代码
// 使用AtomicLong生成ID
// 自动维护一个线程安全的自增id。
private AtomicLong idGenerator = new AtomicLong(1);

@Operation(summary = "创建用户", description = "添加一个新用户") ,描述接口

相关推荐
香气袭人知骤暖3 小时前
SQL慢查询常见优化步骤
android·数据库·sql
韩立学长3 小时前
基于Springboot流浪动物救助系统o8g44kwc(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
丨康有为丨3 小时前
Android滑动冲突详解(场景+解决)
android
我命由我123453 小时前
充血模型与贫血模型
java·服务器·后端·学习·架构·java-ee·系统架构
qq_318121594 小时前
互联网大厂Java面试故事:在线教育微服务架构、缓存优化与AI智能教学全流程解析
java·spring boot·redis·微服务·kafka·spring security·在线教育
小镇学者4 小时前
【other】Goofy Node
后端
颜淡慕潇4 小时前
动态代理赋能:高效爬取沃尔玛海量商品信息与AI分析实战
人工智能·后端
千里马学框架4 小时前
疑难ANR面试题:crash导致ANR深入剖析
android·智能手机·framework·perfetto·性能·anr·小米汽车
大猫和小黄5 小时前
Java异常处理:从基础到SpringBoot实战解析
java·开发语言·spring boot·异常