SpringBoot3---核心特性---1、快速入门II

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringBoot3---核心特性---1、快速入门II

                                                                                 

                       星光下的赶路人star的个人主页

                      知世故而不世故 是善良的成熟


文章目录



1、核心技能


1.1 常用注解


SpringBoot摒弃了XML配置方式,改为全注解驱动


1.1.1 组件注册


@Configuration、@SpringBootConfiguration

@Bean、@Scope

@Controller、@Service、@Repository、@Component

@Import

@ComponentScan

步骤:

1、@Configuration编写一个配置类

2、在配置类中,自定义方法给容器中注册组件,配置@Bean

3、或使用@Import导入第三方的组件


1.1.2 条件注解


如果注解指定的条件成立,则触发指定行为

@ConditionalOnXxx

@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为

@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为

@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为

@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为


场景:


如果存在FastsqlException这个类,给容器中放一个Cat组件,明为cat01,

否则就给容器中放一个Dog组件,名为dog01

如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan

否则,就放一个User,名叫lisi

@ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

@ConditionalOnRepositoryType (org.springframework.boot.autoconfigure.data)

@ConditionalOnDefaultWebSecurity (org.springframework.boot.autoconfigure.security)

@ConditionalOnSingleCandidate (org.springframework.boot.autoconfigure.condition)

@ConditionalOnWebApplication (org.springframework.boot.autoconfigure.condition)

@ConditionalOnWarDeployment (org.springframework.boot.autoconfigure.condition)

@ConditionalOnJndi (org.springframework.boot.autoconfigure.condition)

@ConditionalOnResource (org.springframework.boot.autoconfigure.condition)

@ConditionalOnExpression (org.springframework.boot.autoconfigure.condition)

@ConditionalOnClass (org.springframework.boot.autoconfigure.condition)

@ConditionalOnEnabledResourceChain (org.springframework.boot.autoconfigure.web)

@ConditionalOnMissingClass (org.springframework.boot.autoconfigure.condition)

@ConditionalOnNotWebApplication (org.springframework.boot.autoconfigure.condition)

@ConditionalOnProperty (org.springframework.boot.autoconfigure.condition)

@ConditionalOnCloudPlatform (org.springframework.boot.autoconfigure.condition)

@ConditionalOnBean (org.springframework.boot.autoconfigure.condition)

@ConditionalOnMissingBean (org.springframework.boot.autoconfigure.condition)

@ConditionalOnMissingFilterBean (org.springframework.boot.autoconfigure.web.servlet)

@Profile (org.springframework.context.annotation)

@ConditionalOnInitializedRestarter (org.springframework.boot.devtools.restart)

@ConditionalOnGraphQlSchema (org.springframework.boot.autoconfigure.graphql)

@ConditionalOnJava (org.springframework.boot.autoconfigure.condition)


1.1.3 属性绑定


@ConfigurationProperties:声明组件的属性和配置文件哪些前缀开始项进行绑定

@EnableConfigurationProperties:快速注册注解:

- 场景:SpringBoot默认只扫描注解主程序所在的包。如果导入第三方包,即使组件上标注了@Component、@ConfigurationProperties注解,也没用。因为组件都扫描不进来,此时用这个注解就可以快速进行属性绑定并把组件注册进容器

将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

1、给容器中注册组件(@Component、@Bean)

2、使用@ConfigurationProperties声明组件和配置文件的哪些配置进行绑定


1.2 YAML配置文件


痛点:SpringBoot集中话管理配置,application.properties

问题:配置以后难阅读和修改,层级结构辨识度不高

YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)。在开发的这种语言时,YAML的意思其实是:“Yet Another Markup Language”(是另一种标记语言)

设计目标:方便人类读写

层次分明:更适合做配置文件

使用.yaml或.yml作为文件后缀


1.2.1 基本语法

大小写mgan

使用缩进表示层级关系,k:v,使用空格分割k,v

缩进是不允许使用Tab键,只允许使用空格、换行

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

#表示注释,这个字符一直到行尾,都会被解析器忽略。

支持的写法

对象:键值对的集合,如:映射(map)/哈希(hash)/字典(dictionary)

数组:一组按次序排列的值,如:序列(sequence)/列表(list)

纯量:单个的、不可再分的值,如:字符串、数字、bool、日期


1.2.2 示例


@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data //自动生成JavaBean属性的getter/setter
//@NoArgsConstructor //自动生成无参构造器
//@AllArgsConstructor //自动生成全参构造器
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
}
@Data
public class Dog {
    private String name;
    private Integer age;
}
@Data
public class Child {
    private String name;
    private Integer age;
    private Date birthDay;
    private List<String> text; //数组
}
@Data
public class Cat {
    private String name;
    private Integer age;
}

properties表示法

person.name=张三
person.age=18
person.birthDay=2010/10/12 12:12:12
person.like=true
person.child.name=李四
person.child.age=12
person.child.birthDay=2018/10/12
person.child.text[0]=abc
person.child.text[1]=def
person.dogs[0].name=小黑
person.dogs[0].age=3
person.dogs[1].name=小白
person.dogs[1].age=2
person.cats.c1.name=小蓝
person.cats.c1.age=3
person.cats.c2.name=小灰
person.cats.c2.age=2

yaml表示法

person:
  name: 张三
  age: 18
  birthDay: 2010/10/10 12:12:12
  like: true
  child:
    name: 李四
    age: 20
    birthDay: 2018/10/10
    text: ["abc","def"]
  dogs:
    - name: 小黑
      age: 3
    - name: 小白
      age: 2
  cats:
    c1:
      name: 小蓝
      age: 3
    c2: {name: 小绿,age: 2} #对象也可用{}表示

1.2.3 细节


birthDay推荐写为birth-day

文本:

单引号不会转义【\n则为普通字符串显示】

双引号会转义【\n会显示为换行符】

大文本

| 开头,大文本写在下层,保留文本格式,换行符正确显示

开头,大文本写在下层,折叠换行符

多文档合并

使用—可以把多个yaml文档合并在一个文档中,每个文档区仍然认为内容独立


1.2.4 小技巧:lombok


简化JavaBean开发。自动生成构造器、getter/setter、自动生成Builder模式等

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>compile</scope>
</dependency>


1.3 日志配置


规范:项目开发不要编写Syste.out.println(),应该用日志记录信息


1.3.1 简介


1.Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。

a. spring5及以后 commons-logging被spring直接自己写了。

2.支持 jul,log4j2,logback。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件。

3.logback是默认使用的。

4.虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的默认配置就能工作的很好。

SpringBoot怎么把日志默认配置好的

1、每个starter场景,都会导入一个核心场景spring-boot-starter

2、核心场景引入了日志的所有功能spring-boot-starter-logging

3、默认使用了logback+slf4j组合为默认底层日志

4、日志是系统一启动就要用,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的。

5、日志是利用监听机制配置好的。ApplicationListener

6、日志所有的配置都可以通过修改配置文件使用。以logging开始的所有配置。


1.3.2 日志格式


2023-03-31T13:56:17.511+08:00  INFO 4944 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-31T13:56:17.511+08:00  INFO 4944 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]

默认输出格式:


时间和日期:毫秒级精度

日志级别:ERROR、WARN、INFO、DEBUG、TRACE

进程ID

—:消息分隔符

线程名:使用[]包含

Logger名:通常是产生日志的类名

消息:日志记录的内容

注意:logback没有FATAL级别,对应的是ERROR

默认值:参照:spring-boot包additional-spring-configuration-metadata.json文件

默认输出格式值:%clr(%d{KaTeX parse error: Expected 'EOF', got '}' at position 55: …H:mm:ss.SSSXXX}}̲){faint} %clr({LOG_LEVEL_PATTERN:-%5p}) %clr(P I D : − ) m a g e n t a {PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%nPID:−)magenta{LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

可修改为:‘%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n’


1.3.3 记录日志


Logger logger = LoggerFactory.getLogger(getClass());
或者使用Lombok的@Slf4j注解
• 1
• 2
• 3


1.3.4 日志级别


由低到高:ALL,TRACE、DEBUG、INFO、WARN、FATAL、OFF;

只会打印指定级别及其以上级别的日志

ALL:打印所有日志

TRACE:追踪框架详细流程日志,一般不使用

DEBUG:开发调试细节日志

INFO:关键、感兴趣信息日志

WARN:警告但不是错误的信息日志,比如:版本过时

ERROR:业务错误日志,比如出现各种异常

FATAL:致命错误日志,比如JVM系统崩溃

OFF:关闭所有日志记录

不指定级别的所有类,都使用root指定的级别作为默认级别

SpringBoot日志默认级别是INFO

1、在application.properties/yaml中配置logging.level=指定日志级别

2、level可取值范围:TRACE、DEBUG、INFO、WARN、ERROR、OFF,定义在LogLevel类中

3、root的logger-name叫root,可以配置·logging.level.root=warn,代表所有未指定日志级别都使用root的warn级别


1.3.5 日志分组


比较有用的技巧是:

讲相关的logger分组在一起,统一配置。SpringBoot也支持。比如:Tomcat 相关的日志统一设置

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace
• 1
• 2

SpringBoot预定两个组


1.3.6 文件输出


SpringBoot 默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name or logging.file.path配置项。


1.3.7 文件归档与滚动切割


归档:每天的日志单独存到一个文档中。

切割:每个文件10MB,超过大小切割成另外一个文件。

1.每天的日志应该独立分割出来存档。如果使用logback(SpringBoot 默认整合),可以通过application.properties/yaml文件指定日志滚动规则。

2.如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)

3.支持的滚动规则设置如下

1.3.8 自定义配置


通常我们配置 application.properties 就够了。当然也可以自定义。比如:

如果可能,我们建议您在日志配置中使用-spring 变量(例如,logback-spring.xml 而不是 logback.xml)。如果您使用标准配置文件,spring 无法完全控制日志初始化。

最佳实战:自己要写配置,配置文件名加上 xx-spring.xml。


1.3.9 切换日志组合


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>


1.3.10 最佳实战


1.导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志

2.修改 application.properties 配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xml,log4j2-spring.xml

3.如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可

4.业务中使用slf4j-api记录日志。不要再 sout 了


                                                                                     

                                                                        您的支持是我创作的无限动力

                                                                                     

                      希望我能为您的未来尽绵薄之力

                                                                                     

                    如有错误,谢谢指正若有收获,谢谢赞美

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
监控 Java 应用服务中间件
SpringBoot3---核心特性---1、快速入门
SpringBoot3---核心特性---1、快速入门
|
2月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
300 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
2月前
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
129 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
4月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
148 0
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
7月前
|
前端开发 Java 应用服务中间件
初始SpringBoot:详解特性和结构
初始SpringBoot:详解特性和结构
|
7月前
|
前端开发 Java 应用服务中间件
初始SpringBoot:详解特性和结构
SpringBoot项目结构,特性介绍(pom里的parent、start等常用到的基本都讲解了,很详细,基于官方文档讲解)
346 1
初始SpringBoot:详解特性和结构
|
7月前
|
前端开发 Java 应用服务中间件
初始SpringBoot:详解特性和结构
初始SpringBoot:详解特性和结构
|
Java Spring
Intellij IDEA 2017新特性之Spring Boot相关
Intellij IDEA 2017新特性之Spring Boot相关
142 0
Intellij IDEA 2017新特性之Spring Boot相关
|
缓存 安全 Java
「新特性」Spring Boot 全局懒加载机制了解一下
在 Spring 中,默认情况下所有定的 bean 及其依赖项目都是在应用启动时创建容器上下文是被初始化的
6284 0
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
176 1