SpringBoot之核心

1、SSM开发面临的问题

1.1、版本兼容性问题

  添加依赖时,需要指定版本,当开发功能时,我们需要整合其他技术,可能就会导致版本兼容性问题。

1.2、大量且固定的配置

  我们在开发时需要大量的配置文件,甚至和第三方框架整合时需要整合配置,比较麻烦也不容易记忆。

2、SpringBoot的基本概念

2.1、SpringBoot是什么

  • JavaEE的一站式解决方案,一套真正的Spring全家桶应用

  • Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的。

  • 使用它可以做到专注于Spring应用的开发,无需过多关注XML的配置。

  • 它提供了一堆依赖包,并已经按照使用习惯解决了依赖问题。使用默认方式实现快速开发。

  • 提供大多数项目所需的非功能特性,诸如:嵌入式服务器、安全、心跳检查、外部配置等。

  • Spring Boot 不生成代码,完全无需 XML配置,创建即用。

2.2、SpringBoot的开发要求

  不同的版本开发要求不同,以2.2.5版本为例,要求如下:

  由于SpringBoot更新很快 并且向前兼容 所以我们可以直接学习

2.3、SpringBoot的四大核心

  • 1:自动配置:常用的功能 SpringBoot 自动提供相关配置

  • 2:起步依赖:这个怎么表达呢?大概的意思就是:需要什么功能 直接引入starter SpringBoot 它就会引入需要的依赖

  • 3:Actuator:能够深入SpringBoot应用程序 让你看到SpringBoot内部信息

  • 4:命令行界面:这个是Spring可选特性 主要针对Groovy语言

3、SpringBoot的简单使用

3.1、SpringBoot项目创建

  非maven项目可以使用springboot maven项目也可以使用springboot 我们以maven项目说明

3.1.1、新建maven工程

创建maven工程

 确定坐标信息

 开启自动导入

3.1.2、添加坐标

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

 

 3.1.3、创建一个类

3.1.4、创建一个Controller

3.1.5、运行main方法

3.1.6、控制台打印

3.1.7、浏览器访问测试

3.2、SpringBoot项目的疑问

  • 疑问一: 我pom文件中 并没有依赖spring和springmvc 为何controller可以直接访问

  • 疑问二: 我只是建立了一个普通的java的maven工程 根本就不是web工程 哪来的tomcat

3.2.1、疑问一说明

  虽然说我们只是依赖了springbook-starter-web,但是我们有间接依赖了其他spring相关内容

3.2.2、疑问二说明

  springbook-starter-web不仅间接依赖了其他spring相关内容,还间接依赖了Tomcat,此时Tomcat内置了,并且Jackson相关的jar包也都支持了,也就是说我们依赖了一个web启动器就满足了正常的web层开发。

3.3、SpringBoot项目分析

  我们还有一些疑问没有解答,就是虽然说间接依赖了web层的很多支持,项目也能正常运行,但是他们的版本在哪指定的,有没有版本兼容性问题呢? 另外我们并没有任何的配置,扫描以及注解驱动等等都没有。

3.3.1、项目分析之父标签

  在SpringBoot的父工程中,主要是做版本管理,是通过pom文件中<parent>标签做依赖管理中的版本管理。

  盘本管理在父工程中,符合开发理念,所以我们在子工程中不需要指定版本,可以直接使用。

注意:

  父工程中的版本我们可以不指定,但是我们有时使用的坐标父工程中没有指定这个版本,此时我们需要指定版本。

3.3.2、项目分析之web启动器

  web启动器,帮我们自动依赖了web开发时所需要的依赖,所以我们开发时,只需要依赖启动器即可。

3.3.3、项目分析之启动器

  刚才的分析 让我们了解了 虽然说我们只是引入了 web的启动器 但是也间接依赖了springmvc和spring ,虽然说 我们这些包有了 但是我们开发ssm时需要大量的配置 比如包扫描等等 为何在项目中看不到呢?

  因为这里都是使用注解进行开发。

  SpringBoot帮我们做了很多的事,我们只需要用学会怎么使用这些注解就可以了。

注解说明:

@SpringBootApplication注解:

这个注解标注在类上,表示这个类就是SpringBoot的主配置类,是SpringBoot的最核心的注解

@SpringBootConfiguration注解:

这个注解标注在类上,表示这个类是Spring的配置类,这个注解表明SpringBoot的配置注解,底层是使用Spring原生配置注解@Configuration,用来替代xml配置的

@EnableAutoConfiguration注解:

这个注解有2个功能

第一个:自动包扫描,依赖@AutoConfigurationPackage注解

第二个:自动配置一些配置类,依赖@Import注解(@Import注解是Spring的原生注解,向容器中导入多个组件)

@ComponentScan注解:

很明显是包扫描的注解,但是此时的功能是,只排出那些包不扫描

3.3.4、注解功能分析

@AutoConfigurationPackage自动扫描包说明

  自动扫描的包是SpringBootApplication注解所在的包以及子包

 

 

自动配置的包 是@SpringBootApplication注解所在的包以及子包 而不是main方法所在的包 演示如下

 

 导入自动配置分析

  SpringBoot启动时就已经加载了很多的默认配置,所以这些配置我们可以不用管,因为默认已经配置好的

 

 配置类的完整路径

4、SpringBoot手脚架创建工程

4.1、新建工程

4.2、选择初始化器

4.3、填写项目信息

4.4、勾选功能模块

4.5、确认信息

4.6、删除不需要的信息

4.7、工程目录介绍

4.8、编写Controller

4.9、测试

5、SpringBoot的配置文件

SpringBoot的配置文件分为2种

  第一种:properties格式

  第二种:yml(yaml)格式

5.1、properties的语法

5.1.1、配置普通值

  注意:此时没有使用@PropertiesResource注解加载这个配置文件,因为这个配置文件是SpringBoot的配置文件,会自动加载

5.1.2、配置对象

  @ConfigurationProperties 这个注解 表示从主配置文件中 读取配置的内容 读取内容的类 必须在容器中 并且这个注解给属性赋值 依赖set方法 如果不提供set方法 可以使用@Value代替@ConfigurationProperties

5.1.3、配置map集合

5.1.4、配置list集合

 

   总结: properties配置文件 配置字符串时 不需要加引号 如果加了引号 那么这个引号属于字符串的一部分

5.2、yml格式语法

5.2.1、配置普通值

5.2.2、配置对象

 

 

 

 单行写法:

5.2.3、配置map集合

  map格式和对象格式一样 只是不需要指定前缀 而是把前缀当做map的变量名

5.2.4、配置list集合

 

 

 总结:YML格式配置文件 字符串 也不需要加引号

5.3、配置文件中变量的接收

  在SpringBoot的配置文件中 定义变量 接收的方式 有2种。

  注意:这2种方式所使用的类 必须在spring容器中

  • 第一种@Value的方式

    这种方式 不依赖于set方法 直接指定配置key 获取值

  • 第二种@ConfigurationProperties注解

    这种方式需要依赖于set方法 默认从springBoot的配置文件中 读取属性名一致的key 并且可以指定前缀

5.4、警告说明

 

 

   当使用@ConfigurationProperties注解时,idea界面会弹出一个警告框, 官方文档的说明中表示,这个注解可以不要,这个注解并不影响系统的运行,但是加上这个注解后,当先编写类和属性时,我们配置的时候会有提示。

5.5、配置文件占位符

6、加载非本身properties

7、SpringBoot配置文件的其他说明

7.1、同时存在问题

  2个配置文件同时存在时,Properties配置的优先级高

7.2、同时存在yml加不加载

  如果Application.properties和Application.yml配置文件同时存在,则会同时加载,如果两个配置文件的内容相同,以properties格式的配置文件为准

7.3、项目中配置文件加载位置

  我们通过脚手架创建的springboot工程 默认的配置文件在resources下 也就是类路径下,实际上 如果配置文件在项目中的话 可以有4个位置可以放 并且有一定的优先级

第一个:文件路径下的config目录 file: /config/

第二个:文件路径下 file:/

第三个:类路径下的config文件夹 classpath:config/

第四个:直接类路径下(也就是自动生成properties的位置)

  • 注意点

    • 第一点:这四个SpringBoot 默认加载的配置文件的路径 优先级是从高到底的 优先级越高 越先加载 并且如果优先级高的配置和优先级低的配置重复 那么高优先级的配置 会覆盖低优先级的配置 如果高优先级配置文件中没有的配置 而在低优先级当中配置了 照样可以是生效的 也会形成互补配置

    • 第二点:这四个配置 优先级高的2个 也就是文件路径下的2个配置文件加载仅在开发工具上运行的时候生效 发布的时候不生效 因为因为SpringBoot项目是一个maven项目 而maven项目 有maven项目包的规范 也有打包规范 所以项目在打包发布的时候 文件路径下的配置文件 并不会被打包 只会打包类路径下的配 置文件

7.4、修改SpringBoot配置文件的位置(了解)

springboot在官网中就说明了,spring.config.name和spring.config.location在很早的时候就用于确定必须加载那些文件,必须将他们定义为环境属性(通常是OS环境变量、系统属性或命令行参数)

java -jar springboot2-0.01-SNAPSHOT.jar --spring.config.location=\\E:aaa.properties

7.5、项目外的配置文件加载

官方文档说明:

7.5.1、命令行参数

7.5.2、虚拟机参数

7.5.3、默认外部位置

8、自动配置原理

1、SpringBoot帮助我们通过配置类,自动配置了很多默认内容,配置类的名字是XXXAutoConfiguration

2、自动配置类中的默认配置使用xxx.properties指定,而这个properties当中的属性名,就是我们可以配置的内容

3、如果你不配置,SpringBoot使用默认配置,如果你配置了,SpringBoot就使用你的配置

9、SpringBoot日志管理

  SpringBoot它是为了方便搭建环境 减少配置 那么问题来了 当用SpringBoot 搭建环境的时候 肯定要使用第三方框架 比如说Spring mybatis 或者其他的一些框架 而每个框架 可能都有自己使用的日志框架 比如Spring 用的是 JCL mybatis 使用的log4J 面对这种情况 我们的项目 不就是日志大杂烩了吗?什么日志框架都有 那么怎么做到日志框架的统一呢?

  SpringBoot采用的是SLF4J+logback的方式 并且默认支持所有的日志

官方说明:

 

 

 

9.1、日志的使用和隔离级别

9.2、修改默认级别

9.3、日志入盘

  默认情况下 springboot的日志 只会在控制台打印 项目发布之后 没有控制台 出现问题 则看不到日志 此时我们需要把日志输入到我们的硬盘 此时项目出现问题 我们可以通过查看日志 进行问题追踪。

  如果使用logging.file.name指定日志的位置,必须有目录、有文件、并且文件的后缀是.log 

  如果使用logging.file.path指定日志的位置,只需要指定到文件夹,具体的文件不需要指定,默认会在指定的文件夹创建一个spring.log

9.4、日志的其他配置

  logging.pattern.console 控制台格式

logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n

##带颜色的配置
logging.pattern.console=%clr(%d{yyyy-MM-dd}=== [%thread] === %-5level === %logger{50} ==== %msg%n)

  logging.pattern.file 文件中日志格式

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
 
其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数/

 

9.5、整合log4j2

  • 排除已有的日志

  • 加入log4j2的日志
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

 

  • 导入日志配置

  • 读取配置文件
logging.config=classpath:log4j2-spring.xml

 

  • 测试

10、如何向容器中添加组件

10.1、自己写的类

Component
public class Student {

    private String name="zhangsan";

    private int  age = 18;

 

10.2、别人写的类

 

 

 


 

posted @ 2021-07-09 20:36  mini9264  阅读(477)  评论(0编辑  收藏  举报