SpringBoot基础(一)

一、SpringBoot简介

Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。
也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。
Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。
同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。
它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架

Spring Boot 的特点

  1. 独立运行的 Spring 项目
    Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令java –jar xxx.jar 即可运行。

  2. 内嵌 Servlet 容器
    Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

  3. 提供 starter 简化 Maven 配置
    Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。

  4. 提供了大量的自动配置
    Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。

  5. 自带应用监控
    Spring Boot 可以对正在运行的项目提供监控

  6. 无代码生成和 xml 配置
    Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

http://c.biancheng.net/spring_boot/overview.html

二、启动器 spring-boot-starter

starter 整合了各种场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。
starter 提供了大量的自动配置,所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则。

自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的org.springframework.boot.autoconfigure.包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中

SpringApplication.run分析

该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;

SpringApplication这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器 , 设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

三、yaml教程

SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

  • application.properties
  • application.yml

yaml是一种以数据为中心的标记语言

yaml 的语法

  • 使用缩进表示层级关系。
  • 缩进时不允许使用 Tab 键,只允许使用空格。
  • 缩进的空格数不重要,但同级元素必须左侧对齐。
  • 属性和值的大小写都是十分敏感的。

字面量写法

  • “ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;

    比如 :name: "kuang \n shen" 输出 :kuang 换行 shen

  • ' ' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出

    比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen

对象写法

普通写法

student:
  name: jack
  age: 22

行内写法:

student: {name: jack,age: 22}

数组写法

YAML 使用“-”表示数组中的元素,普通写法如下:

pets:  
  -dog  
  -cat  
  -pig

行内写法:

pets: [dog,cat,pig]

组织结构

一个 YAML 文件可以由一个或多个文档组成,文档之间使用---作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则分隔符可以省略。

yaml注入配置文件(配置绑定)

所谓“配置绑定”就是把配置文件中的值与 JavaBean (实体类)中对应的属性进行绑定。

SpringBoot 提供了以下 2 种方式进行配置绑定:

  • 使用 @ConfigurationProperties 注解
  • 使用 @Value 注解

@ConfigurationProperties

作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数
prefix = “person” : 将配置文件中的person下面的所有属性一一对应

举例:
1 使用yaml配置的方式进行注入,大家写的时候注意区别和优势,我们编写一个yaml配置!

person:
  dog:
    name: 旺财
    age: 2
  name: jack
  lists: [1,2,3]
  maps: {k1: v1,k2: v2}

2 注入到类中

@Component //注册bean
@ConfigurationProperties(prefix = "person") //prefix:前缀
public class Person {
    private Dog dog;
    private String name;
    private List<Object> lists;
    private Map<String, Object> maps;
}

3 IDEA 提示,springboot配置注解处理器没有找到,需要一个依赖!

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

4 测试

@SpringBootTest
class Springboot02ConfigApplicationTests {
    @Autowired
    private Person person; //将person自动注入进来
    
    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

@PropertySource

如果将所有的配置都集中到 application.properties 或 application.yml 中,那么这个配置文件会十分的臃肿且难以维护,
因此我们通常会将与 Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。

@PropertySource(value = "classpath:person.properties")

对比小结

@PropertySource :加载指定的配置文件;

@configurationProperties:默认从全局配置文件中获取值;

@value:如果在某个业务中,只需要获取配置文件中的某个值,可以使用 @value;

1、松散绑定:比如我的yml中写的last-name,这个与类中的属性名lastName是一样的, - 后面跟着的字母默认是大写的。

四、JSR303数据校验

这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性。

@validated

Springboot中可以用来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
我们这里来写个注解让我们的name只能支持Email格式:

@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated  //数据校验
public class Person {
    
    @Email(message="邮箱格式错误") //name必须是邮箱格式
    private String name;
}

常见参数

@NotNull(message="名字不能为空")
private String userName;

@Max(value=120,message="年龄最大不能查过120")
private int age;

空检查
@Null       验证对象是否为null
@NotNull    验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty   检查约束元素是否为NULL或者是EMPTY.
    
Booelan检查
@AssertTrue     验证 Boolean 对象是否为 true  
@AssertFalse    验证 Boolean 对象是否为 false  
    
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
@Length(min=, max=) string is between min and max included.

日期检查
@Past       验证 Date 和 Calendar 对象是否在当前时间之前  
@Future     验证 Date 和 Calendar 对象是否在当前时间之后  
@Pattern    验证 String 对象是否符合正则表达式的规则

.......等等
除此以外,我们还可以自定义一些数据校验规则

五、多环境(版本)切换

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境。

server:
  port: 8081
#选择要激活那个环境块
spring:
  profiles:
    active: test

---
server:
  port: 8083
spring:
  profiles: dev #配置环境的名称

---
server:
  port: 8084
spring:
  profiles: test  #配置环境的名称

六、配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者.yml文件,
作为Spring boot的默认配置文件:

优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件

七、自动装配的原理

自动装配的组件

SpringBoot自动装配通过多部分组件协调完成,这些组件主要有下面几种,这几种组件之间协调工作,最终完成了SpringBoot的自动装配。

  1. @EnableAutoConfiguration:用于根据用户所引用的jar包自动装配Spring容器,比如用户在ClassPath中包含了HSQLDB,但是没有手动配置数据库连接,那么Spring会自动使用HSQLDB作为数据源。
  2. @Condition:不同情况下按照条件进行装配,Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean
  3. @ComponentScan:扫描指定包下面的@Component注解的组件。

https://www.cnblogs.com/yuhushen/p/15771063.html

精髓

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

xxxxAutoConfigurartion:自动配置类;给容器中添加组件

xxxxProperties: 封装配置文件中相关属性;

posted @ 2022-03-21 22:47  yu10001  阅读(66)  评论(0编辑  收藏  举报