SpringBoot02:自动装配原理和yaml

运行原理初探:

1、pom.xml

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>

  点进去,里面还有一个父项目:

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

 再点进去,里面管理了大量的jar包版本:

我们在写入或者引入一些Springboot依赖的时候,不需要指定版本,就是因为有这些版本仓库。

2、启动器(spring-boot-starter)

spring-boot-starter-xxx:就是springboot的启动器

比如 spring-boot-starter-web,它就会帮我们自动导入web环境所有的依赖

springboot会将所有的功能场景,都变成一个个的启动器。我们要使用什么功能,只需要找到对应的启动器就可以了

3、主程序

//标注这个类是一个Springboot的应用
@SpringBootApplication
public class Springboot01HelloworldApplication {

    public static void main(String[] args) {
        //将Springboot应用启动
        SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }

}

我画的思维导图:ProcessOn Mindmap

结论:springboot所有的自动配置都是在启动的时候扫描并加载。扫描的是spring.factories,所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立。条件是否成立 —> 只要导入了对应的starter,就有了对应的启动器,有了启动器,我们自动装配就会生效,然后就配置成功了。

 

步骤:

1、 springboot在启动的时候,从 /META/spring.factories获取指定的值

2、将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置

3、以前我们需要自动配置的东西,现在springboot帮我们做了

4、整个javaee,解决方案和自动配置的东西都在spring-boot-autoconfigure:2.4.5这个包下

5、它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器

6、容器中也会存在非常多的xxxAutoConfiguration的文件,就是这类给容器中导入了这个场景需要的所有组件,并自动配置        @Configuration

7、有了自动配置类,免去了我们手动编写配置文件的工作

主启动类怎么运行(了解)

1、SpringApplication

这个类主要做了一下4件事:

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

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

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

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

2、run()方法

谈谈你对SpringBoot的理解:1、自动装配                2、run() 

springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refreshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式注册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面以什么什么EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器

配置文件

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

1、application.properties

格式:key=value

2、application.yaml(或者application.yml)

格式:key: value
注意:冒号后面一定要有一个空格

配置文件的作用:

修改springboot自动配置的默认值,因为springboot在底层都给我们自动配置好了

yaml基础语法

#对象
student:
  name: qiu
  age: 3

#数组:
pets:
  - dog
  - cat
  - pig

 也可以换成行内写法:

#对象
student: {name: qiu, age: 3}

#数组:
pets: [dog,cat,pig]

给属性赋值的2种方式

步骤:

1、编写一个Dog类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {
    private String name;
    private Integer age;
}

2、再编写一个Person类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birthday;
    private Map<String, Object> maps;
    private List<Object> hobbies;
    private Dog dog;
}

3、给属性赋值

①用我们原来的方式给Dog类的属性赋值:@Value

测试一下:

输出结果:

②用yaml给Person类的属性赋值 :@ConfigurationProperties

 

 测试一下: 

 输出结果:

Person(name=丘桔, age=22, happy=true, birthday=Tue Dec 12 00:00:00 CST 2000, maps={k1=v1, k2=v2}, hobbies=[eat, sleep, money], dog=Dog(name=旺财, age=3))

 补充:

如果Person类中有个爆红:

解决方式:配置依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.5.4</version>
        </dependency>

对比一下这2种给属性赋值的方式:

@Value@ConfigurationProperties
功能一个个指定批量注入配置文件中的属性
松散绑定(松散语法)不支持支持
SpEL支持不支持
JSR303数据校验不支持支持
复杂类型封装不支持支持

松散绑定:比如dog-name和dogName等价

JSR303数据校验:在字段上,增加一层过滤器验证,来保证数据合法

复杂类型封装:yaml中可以封装对象,但是@Value不可以

JSR303校验

步骤:

1、导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.4.5</version>
        </dependency>

 2、使用注解

常用校验:

@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;

空检查
@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 对象是否符合正则表达式的规则

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

多环境配置及配置文件位置

多配置环境:

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

比如:

application-dev.properties 代表开发环境配置

application-test.properties 代表测试环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件

我们需要通过一个配置来选择需要激活的环境:

spring.profiles.active=test

配置文件加载位置优先级:

1、file: ./config/
2、file: ./
3、classpath: /config/
4、classpath: /

自动配置原理再理解

以HttpEncodingAutoConfiguration为例:

1、Springboot启动的时候会加载 /META-INF/spring.factories下面的大量的自动配置类(xxxAutoConfiguration)

2、每个自动配置类按照条件进行生效,默认绑定配置文件

有一个@EnableConfigurationProperties(ServerProperties.class)注解

ServerProperties.class点进去,里面绑定了配置文件

3、我们可以通过debug=true来查看哪些自动配置类生效了,哪些没有生效。

生效的就不需要再手动配置了;没有生效的可以导入对应的starter让它生效。

 4、我们还可以通过application配置文件,指定这些属性的值

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值