SpringBoot学习(一)引入、分析、核心

SpringBoot

springboot帮助开发者简单、快速地创建一个独立的、生产级别的spring应用。大部分秩序编写少量配置即可快速整合spring平台及第三方技术;

特性

  1. 快速创建独立应用;
    SSM:导包、配置、运行
  2. 直接嵌入Tomcat、jetty or undertow(无需部署war包),直接jar包即可;
  3. 提供可选starter,简化应用整合;

场景启动器(starter)
导包一堆,控制版本
为每种场景准备对应依赖

  1. 按需自动配置Spring及三方库;

若要使用场景(生效),则自动配置对应内容
约定大于配置,每个场景有各自默认配置
支持自定义配置文件

  1. 提供监控指标、健康检查、外部化配置等生产级特性;
  2. 无代码生成、无xml;

示例

  1. pom.xml中添加<parent> <dependency>
<!--所有springboot项目都必须继承自spring-boot-starter-parent-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.5</version>
</parent>
<dependencies>
    <!--web开发启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  1. 主程序
@SpringBootApplication//标志为springboot应用
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(mainApplication.class, args);
    }
}
  1. 业务
//@ResponseBody和@Controller组合
//每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中
@RestController
public class Controller {
	//用于类和方法上,用于定义HTTP GET请求的URL路径。
	//当客户端发送HTTP GET请求时,
	//Spring Boot会自动将请求映射到具有相应URL路径的控制器方法上。
    @GetMapping("/Hello")
    public String hello() {
        return "Hello There";
    }
}
  1. 测试
    在这里插入图片描述
  2. 打包
    maven clean package将项目达成可执行的jar包
    java -jar demo.jar启动项目
先导入
<!--springboot打包应用-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

总结

简化整合

导入相关场景:

官方命名:spring-boot-starter-*
第三方命名:*-spring-boot-starter

简化开发

无需编写配置,直接开发业务

简化配置

resources.application.properties进行集中式管理配置

简化部署

打包为可执行 jar 包,使得环境中只需有java环境即可

简化运维

运行时修改配置,只需在外部启用一个application.properties文件,监控、健康检查等

Spring Initializer创建向导

快速创建项目及结构
在这里插入图片描述

应用分析

依赖管理机制

  1. maven依赖传递,A-B-C,拥有A则拥有B、C
  2. boot项目拥有父项目spring-boot-starter-parent,其也拥有父项目spring-boot-dependencies,这个项目中声明了所有常见 jar 依赖的版本号。若要自定义则在pom.xml中就近声明
    在这里插入图片描述
  3. 第三方库的 jar 包需要自行声明版本号

自动配置机制

初步理解
  1. 自动配置的Tomcat、SpringMVC等
  2. 默认的包扫描规则:
    默认扫描主程序所在的包(com.*.boot)及其下的子包,代替component-scan功能;
    自定义扫描路径:
    @SpringBootApplication(scanBasePackages = "com.*") or
    @ComponentScan("com.*")
  3. 配置默认值
    配置文件的所有配置项都适合特定属性类对象值一一绑定的,如Tomcat服务器有关配置—ServerProperties,文件上传有关配置—MultipartProperties
  4. 按需记载自动配置
    场景启动器会首先导入spring-boot-starter作为核心,其是所有starterstarter
    核心也会导入一个spring-boot-autoconfigure,其中为各种场景的自动配置类;
完整流程
  1. 导入starter-web,引入web开发厂场景
  • 场景启动器导入相关所有依赖:starter-json starter-tomcat springmvc
  • 每个启动器都引入spring-boot-starter的核心启动器;
  • 核心启动器引入spring-boot-autoconfigure包;
  • spring-boot-autoconfigure囊括所有场景的所有配置;
  • SpringBoot默认扫描不到spring-boot-autoconfigure下写好的所有配置类(已做整合操作),默认只扫描主程序所在包;
  1. 主程序SpringBootApplication
  • @SpringBootApplication由三个注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
  • @EnableAutoConfiguration:SpringBoot开启自动配置的核心
  • @Import(AutoConfigurationImportSelector.class)提供功能:向容器中批量导入组件;
  • SpringBoot默认加载142个配置类;
  • 该142个配置类是由spring-boot-autoconfigure下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import文件指定;
  • 项目启动的时候利用@Import批量导入组件机制,把autoconfigure包下的142个*AutoConfiguration类导入进来(自动配置类);
  • 按需生效:不是每个自动配置类都能生效,只有条件注解@ConditionalOn*成立,才能生效;
  1. *AutoConfiguration自动配置类
  • 给容器中使用@Bean放一堆组件;
  • 每个自动配置类都有可能有@EnableConfigurationProperties(ServerProperties.class),用来将配置文件中配的指定前缀的属性值封装到*Properties属性类中;
  • 以Tomcat为例,服务器所有配置都已server开头,配置都封装到了特定属性类中;
  • 容器中所有组件的一些核心参数,都源于*Properties*Properties都是和配置文件绑定的;
  • 只需要修改配置文件,核心组件的底层参数就能被修改;
  1. 业务阶段,无需关心底层整合

效果:导入starter,修改配置文件,就能修改底层行为

SpringBoot学习点

  1. 理解自动配置原理
    a.导入starter --> 生效*AutoConfiguration --> 组件 --> *properties --> 配置文件
  2. 理解其他框架底层.
  3. 能够定制化任何组件

初级开发:导入、Controller、Service、Mapper、少量修改配置文件
高级开发:自定义组件、自定义配置、自定义starter

核心技能

常用注解

SpringBoot采用全注解方式驱动

  1. 组件注册
常用组件作用
@Configuration将类注册为配置类,其本身也是容器中的组件
@SpringBootConfiguration同上,但特别指SpringBoot中的配置类
@Bean在容器中注册组件,名称默认为方法名的小驼峰形式,也可以直接("*")修改注解的值
@Scope组件默认为单实例,通过("prototype")修改为多例
@Import导入第三方组件
@ComponentScan修改默认扫描包路径
  1. 条件注解
    @ConditionalOnXxx:若注解指定的条件成立,则触发后续指定行为
常见条件注解条件
@ConditionalOnClass若类路径中存在这个类(@ConditionalOnClass(value="com.*.*.*"),则触发后续行为
@ConditionalOnMissingClass若类路径中不存在这个类,则触发后续行为
@ConditionalOnBean若类路径中存在这个类(@ConditionalOnBean(value="****.class"),则触发后续行为
@ConditionalOnMissingBean若类路径中不存在这个类,则触发后续行为
  1. 属性绑定
    将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

@ConfigurationProperties

给容器中注册组件(@Component、@Bean)
使用此标签声明组件和配置文件的哪些前缀进行绑定
@ConfigurationProperties(perfix = "(配置文件中的定义)")

@ EnableConfigurationProperties

开启指定组件的属性绑定
默认会把该组件自动放入容器中

  • 快速注册注解,主要用于导入第三方包中的注解。因为SpringBoot默认扫描路径不同,即使组件上标注了@Component``@ConfigurationProperties注解,也无法发挥作用

YAML配置文件

用以解决SpringBoot集中化管理的application.properties文件,配置过多后难以阅读和修改,层级结构辨识度不高的问题;其设计目标是方便读写、层次分明,以.yaml.yml作为后缀名

基本语法
  1. 大小写敏感
  2. 使用缩进标识层级关系,k: v,中间用空格分割
  3. 缩进时不适用Tab,只允许空格执行
  4. 缩进的空格数量不重要,只要求相同层级元素左侧对其
  5. #表示此行从该符号起成为注释
  6. 支持写法:
  • 对象:键值对的集合,如:映射O(map)/哈希(hash)/字典(dictionary)
  • 数组:一组按次序排列的值,如:序列(sequence)/列表(list))
  • 纯量:单个的、不可再分的值,如:字符串、数字、布尔、日期
示例
  1. application.properties
person.name=Max
person.age=18
person.birthDay=2006/3/5
person.like=true
person.friend.name=Chloe
person.friend.age=19
person.friend.birthDay=2005/1/3
person.doe[0].name=cake
person.dog[0].age=3
person.doe[1].name=cookie
person.dog[1].age=2
person.cats.c1.name=candy
person.cats.c1.age=1
person.cats.c2.name=snack
person.cats.c2.age=3
  1. application.yml
person:
  name: Max
  age: 18
  birth-day: 2006/3/5
  like: true
  friend:
    name: Chloe
    age: 19
    birth-day: 2005/1/3
  dogs:
    -name: cake
     age: 3
    -name: cookie
     age:2
  cats:
    c1: 
      name: candy
      age: 1
    c2: {name: snack,age: 3}
辅助工具lombok
  1. 引入依赖
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<scope>compile</scope>
</dependency>
  1. 置于类前
注解作用
@Date自动生成JavaBean属性的getter/setter方法
@NoArgsConstructor自动生成无参构造
@AllArgsConstructor自动生成全参构造
  1. 细节
  • birthDay推荐为birth-day,驼峰换为短横线连接;
  • 文本中单引号不会转义字符,双引号会转义字符;
  • 长文本存放时,使用|会保留原本信息,>会将换行符替换为空格;
  • ---三个下划线标识下列文本为同一部分,可收缩至一处;

日志配置

  • 项目中应用日志记录信息,而非System.out.println()
  • 应选择一个日志门面作为接口,一个日志实现作为实现
日志门面日志实现
JCL(Jakarta Commons Logging)
SLF4j(Simple Logging Facade for Java)
jboss-logging
Log4j
JUL(java.util.logging)
Log4j2
Logback
简介
  1. Spring使用commons-logging作为内部日志,但底层实现是开放可对接其他日志框架的
  2. SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件
  3. logback默认使用
  4. SpringBoot默认配置流程:
  • 每个场景启动器导入的核心启动器,都会引入日志功能spring-boot-starter-logging
  • 默认使用logback + slf4j组合作为底层日志
  • 日志在系统启动时开始使用,*AutoConfiguration是系统启动结束后才放置的组件
  • 日志是利用ApplicationListener监听器机制实现配置
  • 所有日志配置都可通过logging开头的配置文件修改
格式组成
  • 时间日期:毫秒级
  • 日志级别:FATALERRORWARNINFODEBUGTRACElogback没有FATAL
  • 进程ID
  • —:消息分割符
  • 线程名:使用[ ]包含
  • Logger名:常为产生日志的类名
  • 消息:日志记录的内容
记录日志
Loggoer logger = LoggerFactory.getLogger(getClass());

或用@Slf4j进行注解

@Slf4j
@RestController
public class Controller {
	@GetMaaping("/h")
	public string hello() {
		log.info("hello world");
		return "hello wordl";
	}
}
日志级别
  1. 只会打印指定级别以上的日志
  2. 不指定级别的所有类,都使用root指定的级别作为默认
  3. SpringBoot日志默认级别是INFO
  4. 操作:
  • application.properties/yml中配置logging.level.<logger-name> = <level>指定级别
  • level范围:TRACE, DEBUG, INFO, WARN, ERRO, FATAL, OFF,定义在LogLevel类中
  • rootlogger-nameroot,可通过配置logging-level-root = *来配置所有未指定类的日志级别
日志分组

将相关logger分在同组,统一配置

eg.Tomcat
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace

SpringBoot已预定义两个分组

weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework..jdbc.core, org.hibemate.SQL, org.jooq.tools.LoggerListener
文件输出
logging.file.namelogging.file.path示例效果
未指定未指定null金控制台输出
指定未指定my.log写入指定文件,可同时指定路径
未指定指定/var/log写入指定目录,默认为spring.log
指定指定my.log
/var/log
忽略path,以name为准
文件归档与滚动切割
  • 归档:指定时间段的日志文件单独存入一个文档
  • 切割:超过指定大小的文件切割到新文件中
  1. 若未指定,仍使用SpringBoot默认logback日志,则可通过application.properties/yaml文件指定日志滚动规则
  2. 其它日志系统需要自行配置xml文件
  3. 滚动设置规则:
配置项描述
logging.logback.rollingpolicy.file-name-patter日志存档的文件名格式(默认值:${LOF_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.clean-history-on-start应用启动时是否清楚过往存档(默认值:false
logging.logback.rollingpolicy.max-file-size文件切割最大大小(默认:10MB)
logging.logback.rollingpolicy.total-size-cap日志总量容纳最大值,超出后删除旧日志文件(默认值:0B)
logging.logback.rollingpolicy.max-history日志文件保存最大天数(默认值:7)
自定义
  1. 若自行配置xmlgroovy文件,推荐使用-spring变量(例如Log4j2-spring.xml而非Log4j2.xml),便于Spring完全控制日志初始化
  2. 可自由组合不同框架和不同格式配置文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值