提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
—薇薇的学习笔记
SpringBoot 3 学习笔记
深入理解spring boot的自动配置原理
流程
- 1、导入
start-web
:导入了web开发场景- 1、场景启动器导入了相关场景的所有依赖:
starter-json
、starter-tomcat
、spring-mvc
- 2、每个场景启动器都引入了一个
spring-boot-starter
核心场景启动器 - 3、核心场景启动器引入了
spring-boot-autoconfigure
包 - 4、
spring-boot-autoconfigure
囊括了所有场景的所有配置; - 5、只要这个包下面的所有类都能生效,那么相当于spring boot官方写好的整合功能就生效了
- 6、spring boo默认t扫描不到
spring-boot-autoconfigure
下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包
- 1、场景启动器导入了相关场景的所有依赖:
- 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
),只有条件生效才能成立
- 1、
- 1、
- 3、
XXXAutoConfiguration
自动配置类- 1、给容器中使用@Bean放一堆组件,这些组件就能工作了
- 2、每个自动配置类都可能有一个这个注解
@EnableConfigurationProperties(ServerProperties.class)
,用来把配置文件中的指定前缀的属性值封装到xxxProperties
属性类中 - 3、以Tomcat为例:把服务器的所有配置都以
server
开头的,配置都封装到属性类中。 - 4、给容器中放的所有组件的核心参数,都来自于**
xxxProperties
。xxxProperties
都是和配置文件绑定** - 5、只需要改配置文件的值,核心组件的底层参数都能修改
- 写业务,全程无需关心各种整合(底层这些已经写好了,而且已经生效了)
如何学好spring boot
-
理解自动配置原理
-
理解其他框架底层 可以随时定制化任何组件
普通开发:
导入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);
}
}
运行结果如图:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7fbe637ee519e2e572e30b7286fad51d.png)
3、日志配置
规范:项目开发不要用
system.outt.println()
,应该用日志记录信息
-
1、简介
- Spring使用
commons-logging
作为内部日志,但底层日志实现是开放的。可以对接其他日志框架。- a、Spring5以后
commons-logging
直接自己写了
- a、Spring5以后
- 支持
jul
、log4j2
、logback
。spring boot提供了默认的控制台输出配置,也可以配置输出为文件。 logback
是默认使用的- 虽然日志框架很多,但是spring的默认配置就很好使用
- Spring使用
-
2、springboot怎么把日志默认配置好的
- 每一个starter场景,都会导入一个核心场景
spring-boot-starter
- 核心场景引入了日志的所有功能
spring-boot-starter-logging
- 默认使用了
logback+slf4j
组合作为默认底层的日志 - 我们以
spring-boot-starter-web
场景启动器为例
- 日志是系统一启动就要使用的,
xxxAutoConfiguration
是系统启动好了以后放好的组件,后来用的。- 在
spring-boot-autoconfiguration
包里我们点开与日志相关的自动配置文件夹,会发现他和其他的诸如Kafka自动配置文件夹相比缺少了XXXAutoConfiguration
自动配置类 - 日志所有的配置都是可以通过修改配置文件来实现。以
logging
开始的所有配置
- 在
- 每一个starter场景,都会导入一个核心场景
-
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
,WARN
、INFO
、DEBUG
,or TRACE
。
- 进程ID
- —:消息分隔符
- 线程名:使用[]包含的
- Logger名:通常是生产日志的类名
- 消息:日志记录的内容
注意:logback没有Fatal
级别,对应的是error
,在控制台上打入jps即可看到进程ID
默认值:参照:spring-boot
包additional-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.path
和logging.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.xml
或log4j2-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>
- 我们以web场景启动器为例
-
8、切换日志组合
- 导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志
- 修改 application.properties 配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如
logback-spring·xml
,log4j2-spring.xml
- 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka之类的中间件,这和SpringBoot3.没关系,都是日志框架自己的配置,修改配置文件即可
- 业务中使用slf4j-api记录日志。不要再 sout 了