• Springboot的自动配置原理


    什么是Springboot的自动配置

    Springboot:是对Spring框架做的一系列优化,减少了大量繁琐的配置,并提供了内置web服务器,让程序运行更快。

    自动配置:用注解来对一些常规的配置做默认配置,简化xml配置内容,使你的项目能够快速运行。自动装配最明显的特征就是不用xml文件去做配置,而是用properties文件或者yml文件,简单地写一些坐标就能实现各类负载地配置。简单来说,就是自动将Bean装配到IOC容器

    为什么需要自动配置:无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来。

    Springboot自动配置的流程

    Springboot的启动类,启动类的main方法 上有一个Springboot的核心注解@SpringbootApplication

    点进去SpringbootApplication注解看

    1. @Target({ElementType.TYPE}) //修饰类或接口、枚举
    2. @Retention(RetentionPolicy.RUNTIME)//注解在源码,class文件中存在且运行时可以通过反射机制获取到
    3. @Documented//可以在api文档显示
    4. @Inherited//子类可以继承该注解
    5. @SpringBootConfiguration //配置类
    6. @EnableAutoConfiguration//开启自动装配
    7. @ComponentScan //扫描 (不指明包名则默认范围自己所在包及其子类下)
    8. (
    9. excludeFilters = {@Filter(
    10. type = FilterType.CUSTOM,
    11. classes = {TypeExcludeFilter.class}
    12. ), @Filter(
    13. type = FilterType.CUSTOM,
    14. classes = {AutoConfigurationExcludeFilter.class}
    15. )}
    16. )

     关键作用的注解是@EnableAutoConfiguration,根据名称翻译就是开启自动配置。而@EnableAutoConfiguration也是一个复合注解,它包含了@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})。

    1. @Target({ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Inherited
    5. @AutoConfigurationPackage
    6. @Import({AutoConfigurationImportSelector.class})
    7. public @interface EnableAutoConfiguration {
    8. String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    9. Class[] exclude() default {};
    10. String[] excludeName() default {};
    11. }

    可以看到@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})注解加起来就是实现了自动配置的关键。

    @AutoConfigurationPackage注解,从字面意思上来看就是自动配置包。点进去可以看到就是⼀个 @Import 注解:@Import(AutoConfigurationPackages.Registrar.class) ,导⼊了⼀个Registrar 的组件,这个注解的作用就是将主配置类(@SpringBootConfiguration标注的类)所在的包及其下面所有子包里面所有的组件扫描到IOC容器中。所以说,默认情况下主配置类所在包及其子包以外的组件,Spring IOC容器是扫描不到的。

    @Import(AutoConfigurationImportSelector.class)注解通过@Import导入了AutoConfigurationImportSelector类,而这个类的selectImports方法会通过SpringFactoriesLoader得到大量的配置类。而每个配置类则根据条件化配置类做出决策,以实现自动配置的功能。

    我们写配置类只需要加入一个@Configuration注解,Springboot就可以轻松地自己找到想要地目标文件。

    总结:

    1.@EnableAutoConfiguration注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类。

    2.配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当Springboot应用启动的时候,会自动加载这些配置类,初始化Bean。

    3.并不是所有的Bean都会被初始化,需要在配置类中使用Condition来加载满足条件的Bean。

  • 相关阅读:
    redis的五种数据类型
    WebRTC源码之音频设备播放流程源码分析
    IDEA中 tomcat 控制台中文乱码解决
    ArkUI框架,Flex布局,基础组件及封装,父子组件的双向绑定
    人工智能教程(一)
    Go 使用sync.Mutex或sync.RWMutex进行并发安全访问
    《深度学习进阶:自然语言处理》读书笔记:第8章 Attention
    2022年陕西省工程师职称评审程序在这里,还怕上报不了职称吗?
    CF比赛1610D. Not Quite Lee(Codeforces Global Round 17)(数学)(计数)
    C#,数值计算——插值和外推,分段线性插值(Linear_interp)的计算方法与源程序
  • 原文地址:https://blog.csdn.net/weixin_71118996/article/details/127124953