• SpringBoot自动配置原理


    大家好,我是冰蛙!

    该文章时看了尚硅谷雷神的视频后做的SpringBoot自动配置原理剖析一个总结.

    在这里插入图片描述

    一:引导加载自动配置类SpringBootApplication

    首先是核心配置类包含的三个注解:

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    
    public @interface SpringBootApplication{}    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    @SpringBootConfiguration

    @Configuration。代表当前是一个配置类
    
    • 1

    @ComponentScan

    指定扫描哪些,Spring注解;
    
    • 1

    @EnableAutoConfiguration(重点)

    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)//重点
    public @interface EnableAutoConfiguration {}
    
    • 1
    • 2
    • 3
    @AutoConfigurationPackage
    //自动配置包?指定了默认的包规则
    @Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
    public @interface AutoConfigurationPackage {}
    
    //利用Registrar给容器中导入一系列组件
    //将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    @Import(AutoConfigurationImportSelector.class)
    1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
    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
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
    在这里插入图片描述

    spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories
    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
    org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
    org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
    ......127
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    二:按需开启自动配置项

    虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
    按照条件装配规则(@Conditional),最终会按需配置。
    
    
    • 1
    • 2
    • 3

    三:修改默认配置

    @Bean
    @ConditionalOnBean(MultipartResolver.class)  //容器中有这个类型组件
    @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
    	public MultipartResolver multipartResolver(MultipartResolver resolver) {
                //给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
                //SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
    	    // Detect if the user has created a MultipartResolver but named it incorrectly
    		return resolver;
    	}
    //给容器中加入了文件上传解析器;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先

    @Bean
        @ConditionalOnMissingBean
        public CharacterEncodingFilter characterEncodingFilter() {
    }
    
    • 1
    • 2
    • 3
    • 4

    总结:

    • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

    • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

    • 生效的配置类就会给容器中装配很多组件

    • 只要容器中有这些组件,相当于这些功能就有了

    • 定制化配置

      • 用户直接自己@Bean替换底层的组件
      • 用户去看这个组件是获取的配置文件什么值就去修改。

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

  • 相关阅读:
    微软发布Phi-3,手机上就能跑,是时候聊聊小型语言模型了|TodayAI
    linux下golang环境配置问题记录
    websocket简介及上手,node + vue实现websocket服务
    ffmpeg-android studio创建jni项目
    聊聊啥项目适合做自动化测试
    自制操作系统日志——第十四天
    界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件
    WINSOFT ComPort轻松连接到各种串行端口和连接设备
    柯桥托业TOEIC考试和PETS哪个含金量高?
    基于SSM的点餐平台系统设计与实现
  • 原文地址:https://blog.csdn.net/he19970408/article/details/126241342