【薇薇的学习笔记】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

—薇薇的学习笔记

SpringBoot 3 学习笔记

深入理解spring boot的自动配置原理

流程

  • 1、导入start-web:导入了web开发场景
    • 1、场景启动器导入了相关场景的所有依赖:starter-jsonstarter-tomcatspring-mvc
    • 2、每个场景启动器都引入了一个spring-boot-starter核心场景启动器
    • 3、核心场景启动器引入了spring-boot-autoconfigure
    • 4、spring-boot-autoconfigure囊括了所有场景的所有配置;
    • 5、只要这个包下面的所有类都能生效,那么相当于spring boot官方写好的整合功能就生效了
    • 6、spring boo默认t扫描不到spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包
  • 2、主程序:@SpringBootApplication
    • 1、@SpringbootApplication由三个注解组成,@SpringBootConfiguratin@EnableAutoConfiguration@ComponentSacn
    • 2、spring boot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到spring-boot-autoconfigure包中官方写好的配置类
    • 3、EnableAutoConfiguration:Springboot开启自动配置的核心注解
      • 1、@Import({AutoConfigurationImportSelector.class})提供功能,给容器中批量导入组件
      • 2、spring boot启动会默认加载142个启动配置类
      • 3、这142个配置类来自于spring-boot-autoconfigure下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的
      • 项目启动的时候利用@Import批量导入组件机制把AutoConfiguration包下的142XXXAutoConfiguration类导入进来(自动配置类)
      • 4、按需生效:
        • 虽然导入了142个配置类,但142个配置类不一定生效
        • 每一个自动配置类都有一个条件注解(@ConditionalXXX),只有条件生效才能成立
  • 3、XXXAutoConfiguration自动配置类
    • 1、给容器中使用@Bean放一堆组件,这些组件就能工作了
    • 2、每个自动配置类都可能有一个这个注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中的指定前缀的属性值封装到xxxProperties属性类中
    • 3、以Tomcat为例:把服务器的所有配置都以server开头的,配置都封装到属性类中。
    • 4、给容器中放的所有组件的核心参数,都来自于**xxxPropertiesxxxProperties都是和配置文件绑定**
    • 5、只需要改配置文件的值,核心组件的底层参数都能修改
  • 写业务,全程无需关心各种整合(底层这些已经写好了,而且已经生效了)
    核心流程图

如何学好spring boot

  1. 理解自动配置原理

  2. 理解其他框架底层 可以随时定制化任何组件

    普通开发:导入starter,controller、Serveice、Mapper、偶尔修改配置文件
    高级开发:自定义组件、自定义配置、自定义starter

核心:

  • 这个场景自动配置了哪些组件,我们能不能Autowired进来使用
  • 能不能修改配置改变组件的一些默认参数
  • 需不需要自己完全定义这个组件
  • 场景定制化

最佳实战

  • 选场景,导入到项目

    • 官方 starter
    • 第三方:去仓库里搜
  • 写配置,改配置文件

    • 数据库参数 (链接地址。。。账号密码)
  • 分析这个场最给我们导入了哪些能用的组件

    • 自动装配这些组件进行后续使用
    • 不满意boot提供的自动配好的默认组件
      - 定制化
      - 改配置
      - 自定义组件

整合Redis:

  • 选场景 spring-boot-starter-data-redis
    - 场景AutoConfiguration就是这个场景的自动配置类
  • 写配置
    • 分析到这个场景的自动配置类开启了哪些属性绑定关系
    • EnableAutoConfigurationProperties(RedisProperties.class)
    • 修改Redis相关配置
  • 分析组件
    • 分析到RedisAutoConfiguration 给容器中放了 StringTemplate
    • 给业务代码中自动装配StringRedisTemplate
  • 定制化组件
    • 修改配置文件
    • 自己自定义组件,自己给容器中放一个StringRedisTemplate

YML配置文件

1.基本语法

  • 大小写敏感
  • 使用缩进表示层级关系,k: v,使用空格分割k,v
  • 缩进时只用空格,不允许使用Tab键
  • 缩进的空格数量不重要,只要求相同层级的元素左侧对齐即可
  • #表示注释 ,从这个字符一直到行尾都会被解释器忽略

支持的写法

  • 对象:键值对的集合,如:映射(map)/哈希(hash)/字典(dictionary)
  • 数组:一组按照次序排列的值,如:序号(sequence) /列表(list)
  • 纯量:单个的、不可分割的值,如:字符串、数字、boolean、日期

-小技巧:lombok插件,仅在编译期间有效,它可以字节码生成技术(字节码增强)在编译期间自动生成JavaBean的getter和setter方法

简化JavaBean开发,自动生成构造器,getter/setter、自动生成Builder模式等
使用方法:1、导入依赖。2、使用注解

对应的在Javabean中会提供一些注解方便程序员省略掉与业务无关的代码,解放双手
@Data //自动生成Javabean的getter和setter方法
@AllArgsConstructor //自动生成全参构造器
@NoArgsConstructor //自动生成无参构造器

  		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
		</dependency>
@Component
@ConfigurationProperties(prefix = "person")		//和配置文件
@Data   											//自动生成Javabean的getter和setter方法
@AllArgsConstructor 						//自动生成全参构造器
@NoArgsConstructor  					//自动生成无参构造器
public class Person {
   private String name;
   private Integer age;
   private Date birthday;
   private boolean like;
   private Child child;    //嵌套对象
   private List<Dog> dogs;
   private Map<String, Cat> cats;  //表示map
}
@Component
@Data               //自动生成Javabean的getter和setter方法
public class Child {
   private String name;
   private Integer age;
   private Date birthDay;
   private List<String> text;  //数组
}
@Component
@Data               //自动生成Javabean的getter和setter方法
public class Cat {
   private int age;
   private String name;
}
@Component
@Data               //自动生成Javabean的getter和setter方法
public class Dog {
   private int age;
   private String name;
}

在properties上写相关配置类,截图如下

#properties表示复杂对象
person.name=张三
person.age=18
person.birthday=2010/10/01 10:00:00
person.like=true
person.child.name=lisi
person.child.age=17
person.child.birthday=2011/11/01 11:00:00
person.child.text[0]=abc
person.child.text[1]=fghjkl;
person.dogs[0].name=xiaohe
person.dogs[0].age=2
person.dogs[1].name=dabai
person.dogs[1].age=3
person.cats.c1.name=hhgfddvbbb
person.cats.c1.age=4
person.cats.c2.name=dkfjdnfihpn
person.cats.c2.age=5

在yml上写配置文件

person:
  name: zhangsan
  age: 18
  birthDay: 2010/10/01 10:00:00
  like: true
  child:
    name: lisi
    age: 20
    birthDay: 2018/10/01 10:00:00
#    text: ["abc","def"]     #数组类型的第一种写法
    text:
      - abc
      - ert                 #数组类型的第二种写法
  dogs:
    - name: ncojdnf
      age: 3
    - name: jioifdbf
      age: 4
  cats:
    c1:
      name: dddd
      age: 5                        #Map数据类型的第一种写法
    c2: {name: xiaolv, age: 12}     #Map数据类型的第二种写法
/*
 * 启动spring boot项目的主入口程序
 * */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(MainApplication.class, args);
        //获取容器中所有组件的名字
        String[] names = applicationContext.getBeanDefinitionNames();
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
        Person person = applicationContext.getBean(Person.class);
        System.out.println(person);

    }
}

运行结果如图:
在这里插入图片描述
3、日志配置

规范:项目开发不要用system.outt.println(),应该用日志记录信息

在这里插入图片描述

  • 1、简介

    • Spring使用 commons-logging 作为内部日志,但底层日志实现是开放的。可以对接其他日志框架。
      • a、Spring5以后commons-logging直接自己写了在这里插入图片描述
    • 支持jullog4j2logback。spring boot提供了默认的控制台输出配置,也可以配置输出为文件。
    • logback是默认使用的
    • 虽然日志框架很多,但是spring的默认配置就很好使用
  • 2、springboot怎么把日志默认配置好的

    • 每一个starter场景,都会导入一个核心场景spring-boot-starter
    • 核心场景引入了日志的所有功能spring-boot-starter-logging
    • 默认使用了logback+slf4j组合作为默认底层的日志
    • 我们以spring-boot-starter-web场景启动器为例
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 日志是系统一启动就要使用的,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的。
      • spring-boot-autoconfiguration 包里我们点开与日志相关的自动配置文件夹,会发现他和其他的诸如Kafka自动配置文件夹相比缺少了XXXAutoConfiguration自动配置类
      • 日志所有的配置都是可以通过修改配置文件来实现。以logging开始的所有配置在这里插入图片描述
  • 3、日志格式

2024-03-24T16:02:30.478+08:00  INFO 21868 --- [springboot3 - 03 - logging] [           main] 	 		o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2024-03-24T16:02:30.486+08:00  INFO 21868 --- [springboot3 - 03 - logging] [           main] c.g.d.Springboot303LoggingApplication    : Started Springboot303LoggingApplication in 1.822 seconds (process running for 2.245)

默认输出格式:
- 时间和日期:毫秒级精度
- 日志级别:ERROR,WARNINFODEBUG,or TRACE
- 进程ID
- —:消息分隔符
- 线程名:使用[]包含的
- Logger名:通常是生产日志的类名
- 消息:日志记录的内容
注意:logback没有Fatal级别,对应的是error ,在控制台上打入jps即可看到进程ID
在控制台上打入jps即可看到进程ID
默认值:参照:spring-bootadditional-spring-configuration-metadata.json文件
可修改为:%d{yyyy-MM-dd HH:mm:ss.SsS} %-5level [%thread] %logger{15} ===>%msg%n
可在appliction.properties配置文件中修改相关的logging配置项

logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS

改前:在这里插入图片描述
改后:在这里插入图片描述

  • 注意:springboot默认的日志级别:info
#默认所有日志没有精确指定级别就使用root的默认级别
#Logging.level.root=info
Logging.level.root=debug

#精确调整某个包下的日志级别
Logging.level.com.atguigu.logging.controller=info
  • 4、日志分组

    	#精确调整某个包下的日志级别
    	#logging.level.com.atguigu.logging.controller=debug
    	#logging.level.com.atguigu.logging.service=debug
    	#Logging.level.com.aaa=debug
    	#logging.level.com.bbb=debug
    	Logging.group.abc=com.atguigu.logging.controller, com.atguigu.logging.service, com.aaa ,com.bbb
    	Logging.level.abc=debug
    	Logging.level.sql=debug
    	```
    
  • 5、指定日志输出路径

    #指定日志文件路径,日志文件名默认叫 spring.log
    logging.file.path=
    #指定日志文件的名
    logging.file.name= demo.log
    

    注意!:

    • 只写名字,则生成的文件就在当前项目同等位置
    • 写名字+路径,则就在指定路径下生成指定名字的文件
    • 如果只指定文件路径,则会生成一个spring.log的默认日志文件
    • 如果logging.file.pathlogging.file.name同事存在则以file.name为主在这里插入图片描述在这里插入图片描述
  • 6、文件归档和滚动切割

    • 归档:每天的日志单独存放在一个文件夹里
    • 切割:每个文件10Mb,超过了就切割成另外一个文件。
    #指定日志文件的名称
    logging.file.name= demo.log
    
    #归档、切割
    Logging.logback,rollingpolicy.file-name-pattern=${L0G FILE}.%d{yyyy-MM-dd}.%i.gz
    #只要这个文件大小超过1Mb就重新生成一个文件
    Logging.logback,rollingpolicy.max-file-size=1MB
    
    • 1.每天的日志应该独立分割出来存档。如果使用logback(SpringBoot 默认整合),可以通过application.properties/yaml文件指定日志滚动规则。
    • 2.如果是其他日志系统,需要自行配置(添加log4j2.xmllog4j2-spring.xml)
    • 3.支持的滚动规则设置如下
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 7、切换日志组合

    • 我们以web场景启动器为例
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-web</artifactId>
      	<exclusions>
      		<exclusion>
      			<groupId>org.springframework.boot</groupId>
      			<artifactId>spring-boot-starter-logging</artifactId>
      		</exclusion>
      	</exclusions>
      </dependency>
      
      <dependency>
      	<groupId>org.slf4j</groupId>
      	<artifactId>jul-to-slf4j</artifactId>
      	<version>2.0.12</version>
      	<scope>compile</scope>
      </dependency>
      
    • 在这里插入图片描述
  • 8、切换日志组合

    • 导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志
    • 修改 application.properties 配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如 logback-spring·xmllog4j2-spring.xml
    • 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka之类的中间件,这和SpringBoot3.没关系,都是日志框架自己的配置,修改配置文件即可
    • 业务中使用slf4j-api记录日志。不要再 sout 了
  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值