SpringBoot学习篇|配置文件如何一步步被导入生效

SpringBoot学习篇|配置文件如何一步步被导入生效

image-20220618000721149

进入@SpringBootApplication注解查看Springboot的继承关系

org.springframework.boot.autoconfigure.SpringBootApplication

image-20220618051859133

跟进org.springframework.boot.autoconfigure.EnableAutoConfiguration

image-20220618051924408

进入@Import注解导入的AutoConfigurationImportSelector,Springboot就是在这里通过selectImports函数导入配置

显示进入selectImports函数,简单调用链如下:

selectImports

​ getAutoConfigurationEntry

​ getCandidateConfigurations

​ getSpringFactoriesLoaderFactoryClass

​ loadFactoryNames

​ SpringFactoriesLoader#loadSpringFactories //在这里解析"META-INF/spring.factories"配置文件生成Properties对象,我们下面跟进以下这个文件中的类

​ return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());

详细引用如下:

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations

​ org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getSpringFactoriesLoaderFactoryClass

org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames

在org.springframework.boot.autoconfigure.AutoConfigurationImportSelector导入包的META-INF/spring.factories当中有大量的xxxAutoConfiguration类

image-20220618052856514

在这些xxxAutoConfiguration类中有有大量类是通过@EnableConfigurationProperties注解绑定了一个xxxProperties类,而这个xxxProperties类又通过@ConfigurationProperties注解获取配置文件中的对象,并且将其赋值给当前类成员

META-INF/spring.factories的解析

以下为一个META-INF/spring.factories中xxxAutoConfiguration类的一般性跟踪示例:

  1. 跟进一个xxxAutoConfiguration

    image-20220618053444823

  2. 跟进类中通过@EnableConfigurationProperties绑定的xxxProperties

    image-20220618053553526

  3. 可以看到类使用了@EnableConfigurationProperties注解导入配置

    image-20220618053722404

此外部分xxxAutoConfiguration类中有上下文刷新refreshContext注解和上下文后置结束处理afterRefresh注解并且定义了响应函数

这个可以上下文的加载注解的意思参考主启动类的运行中的流程图:

image-20220618001311226

导入配置的选择性生效

了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效;

@Conditional派生注解(Spring注解版原生的@Conditional作用)

image-20220618133016899

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。

我们怎么知道哪些自动配置类生效?

我们可以通过在application.yaml中设置debug=true来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效了

  1. Positive matches:(自动配置类启用的:正匹配)
  2. Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
  3. Unconditional classes: (没有条件的类)

总结

  1. 总的来说就是通过以下注解加载`META-

    INF/spring.factories`文件

    @SpringBootApplication

    @EnableAutoConfiguration

    @Import({AutoConfigurationImportSelector.class})

    AutoConfigurationImportSelector#selectImports获取配置的实例

  2. 其中先获取bean工厂然后对META-INF/spring.factories文件进行解析,解析过程从spring.factories中的xxxAutoConfiguration获取到我们定义的配置文件属性过程如下:

    xxxAutoConfiguration

    @EnableConfigurationProperties

    xxxProperties

    @EnableConfigurationProperties

    获取配置文件属性将配置注入Properties类

    精髓:
    1)SpringBoot启动会加载大量的自动配置类
    2)我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
    3)我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
    4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
    xxxxAutoConfigurartion:自动配置类;

    给容器中添加组件xxxxProperties:封装配置文件中相关属性;

在导入配置后并不是所有配置都生效,需要满足一定的条件才会起作用

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇