springboot开发日记(7)——自动配置原理

springboot——自动配置

在日记(2)中提到过,@SpringBootApplication由以下三个注解组合而成:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan


1. @SpringBootConfiguration

该注解就是@Configuration,代表的当前是一个配置类。(所以说明MainApplication本质上也是一个配置类。)


2. @ComponentScan

定义包扫描的规则,然后会自动扫描包路径下面的所有被@Controller、@Service、@Repository、@Component 注解标识的类,然后装配到Spring容器中。

@ComponentScan("目录")

以上为指定特定路径的最基本语法,也可以通过集合的方式进行多个目录查找。

注意:@ComponentScan默认扫描所在类及其所有子包,如果指定扫描目录将不会扫描所在类及其子包。

通过filter属性进行筛选

FilterType.ANNOTATION:按照注解

FilterType.ASSIGNABLE_TYPE:按照给定的类型;

FilterType.ASPECTJ:使用ASPECTJ表达式

FilterType.REGEX:使用正则指定

FilterType.CUSTOM:使用自定义规则

classes:指定过滤的类

例如

@ComponentScan(value = "com.spring.annotation",excludeFilters = {
        @ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})

@ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})中的type指定按照何种规则进行筛选,class指定具体筛选的规则。


3. @EnableAutoConfiguration

@EnableAutoConfiguration由以下两个注解构成:

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

1)@AutoConfigurationPackage

该注解的作用是将SpringBoot主配置类所在的包及其下面的所有子包里面的所有组件扫描到 Spring 容器中

(2)@Import({AutoConfigurationImportSelector.class})

1、利用getAutoConfigurationEntry(annotationMetadata);该方法的作用就是告诉 Spring容器需要导入什么组件,并以 String[] 的形式返回全类名 
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
    默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
    spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

详情可以参考这里

按需加载:虽然127个场景的所有自动配置启动的时候默认全部加载,但是按照条件装配规则(@Conditional),最终会按需配置。


引用尚硅谷中对自动配置的总结:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties

本节知识较难理解,笔者仍在摸索。

posted @   YTARO  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示