SpringBoot

SpringBoot是一个JavaWeb的开发框架,约定大于配置

HelloWorld

创建一个SpringBoot工程导入web依赖

编写Controller类

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World";
    }
}

即可运行

IDEA点击maven的package将项目打包成jar包,在target目录下。运行java -jar xxx.jar就可以在任何地方运行

运行原理分析

pom.xml文件

父依赖

首先有个父依赖,主要是管理项目的资源过滤及插件

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
</parent>

该父依赖还有一个父依赖。是真正管理SpringBoot里的所有依赖版本的地方

<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.4.5.RELEASE</version>
      <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

启动器

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

spring-boot-starter-xxx就是spring-boot的场景启动器,springboot将所有功能场景都抽取出来,作出starter启动器,只需要在项目中引入这些启动器就会将所有相关的依赖都导入进来

主启动类

//@SpringBootApplication来标注一个主程序类,表明它是一个SpringBoot应用
@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        //启动一个服务
        SpringApplication.run(HelloApplication.class, args);
    }
}

@SpringBootApplication

作用:标注在某个类上说明该类是一个SpringBoot的主配置类,SpringBoot运行该类上的main方法来启动SpringBoot应用

进入该注解,除了元注解里面有3个注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
@ComponentScan

相当于spring'中配置bean

作用:自动扫描并加载符合条件的组件或bean,将这个bean定义加载到IOC容器中

@SpringBootConfiguration

SpringBoot的配置类,标注在某个类上,表示是一个SpringBoot的配置类

@EnableAutoConfiguration

表示开启自动配置功能,将主启动类所在包及下面子包里的所有组件扫描到Spring容器。

小结
  1. SpringBoot在启动时从类路径下的META-INF/spring.factories中获取EnableAutoconfigurationde指定的值
  2. 将这些值作为自动配置类导入容器,自动配置类就生效了
  3. 自动配置都在spingboot-autoconfigure的jar包中

SpringApplication

SpringApplication.run方法主要分为两部分,第一部分就是SpringApplication的实例化,第二部分就是run()方法的执行

SpringApplication做如下四件事:

  • 判断应用的类型是普通的项目还是Web的项目
  • 查找并加载所有可用的初始化器,并设置到initilizers属性中
  • 查找所有的应用程序监听器,设置到listeners属性中
  • 推断并设置main方法的定义类,找到运行的主类

run()方法

 

Yaml语法学习

SpringBoot使用一个全局配置文件,配置文件的名称是固定的

  • application.properties
    • 语法结构:key=value
  • application.yml
    • 语法结构:key:空格value

可以在配置文件中修改SpringBoot的一些默认配置

yml基础语法

  • 空格不能省略
  • 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的
  • 属性和值的大小写都是敏感的

字面量:k: v

字符串默认不用加双引号或单引号,使用双引号时,字符串里的转义字符会生效,使用单引号时,字符串里的转义字符不会生效

对象Map

student1:
     name: dwx
     age: 3
//行内写法 student2: {name: dwx,age: 2}

数组List Set

用-表示一个元素

pets:
  - cat
  - dog
  - pig
//行内写法
pets: [cat,dog,pig]

注入配置文件

yml文件实现注入

编写实体类

@Data
@Component //注册bean到容器中
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
}

编写appllication.yml

person:
  name: dwx
  age: 11
  happy: false
  birth: 1998/1/1
  maps: {sex: boy,weight: 120}
  lists: [zzy1,zzy2,zzy3]

要导入配置处理处理器

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
</dependency>

测试类中测试

@SpringBootTest
class HelloApplicationTests {
    @Autowired
    private Person person;
    @Test
    public void test() {
        System.out.println(person);
    }
}

@ConfigurationProperties作用:将配置文件中配置的每一个属性的值映射到该主键中,告诉SpringBoot将该类的所有属性和配置文件中的相关配置进行绑定,prefix=“person”,表示将配置文件中的person下的属性与类中属性一一对应

如果配置文件中的key值与类中的属性值不一样,则输出结果为null,注入失败

加载指定配置文件

@PropertySource:可以加载指定的配置文件,与@Value组合使用

@Data
@Component //注册bean到容器中
@PropertySource(value = "classpath:person.yml")
public class Person {
    @Value("${name}")
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
}

使用@Value也可以给属性赋值

对比

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个属性指定
松散绑定 支持 不支持
EL表达式#{} 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

松散绑定即last-name==lastName

JSR303数据校验表示在字段增加一层过滤器验证,可以保证数据的合法性

JSR303数据校验

使用@Validated来校验数据,在属性上添加格式注解即可

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

多环境切换

profile是Spring对不同环境提供不同配置功能的支持

多配置文件

编写主配置文件时,通过application-{profile}.properties/yml来指定多个环境版本,如测试环境配置application-test.yml,SpringBoot并不会启动这些配置文件,默认使用application.yml主配置文件,需要使用配置来激活环境

spring:
    profiles:
        active: test

如果yml和properties同时存在同一目录下, 默认会使用properties配置文件的!

配置文件加载位置

SpringBoot在启动时会扫描以下位置的application.properties/yml文件作为其默认配置文件,优先级层高到低

  • 先从项目的根目录找config文件夹下的配置文件
  • 再去根目录找配置文件
  • 去resources下找config文件夹下的配置文件
  • 再去resources下找配置文件

SpringBoot会从四个位置加载全部的主配置文件,如果优先级高的配置文件属性与优先级低的配置文件属性冲突就会覆盖优先级低的值,如果不冲突就会共同存在,这就是互补配置

配置文件自动配置原理

根据当前的条件判断配置类是否生效

如果该配置类生效:

  • 配置类给容器添加很多组件
  • 组件的属性都是从对应的properties类中获取的,类中的每个属性与配置绑定
  • 配置文件中能够配置的属性都在XXXProperties类中封装
posted @ 2021-04-30 15:31  我还有头发  阅读(88)  评论(0编辑  收藏  举报