• [学习记录] SpringBoot 3. 自动配置


    SpringBoot 3. 自动配置

    尚硅谷

    官方文档

    1. 引导加载自动配置类

    @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
    • 7

    1.1 @SpringBootConfiguration

    @Configuration 表示当前是一个配置类

    1.2 @ComponentScan

    指定扫描哪些包。

    1.3 @EnableAutoConfiguration

    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
    	// ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1.3.1 @AutoConfigurationPackage

    自动配置包,指定默认的包规则

    // @Import 给容器中导入一个组件
    @Import(AutoConfigurationPackages.Registrar.class)
    public @interface AutoConfigurationPackage {
    	// ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    @Import 高级用法

    利用 Register 给容器导入一系列组件。
    将指定的一个包下的所有组件导入进来。主程序类 SpringbootReviewRecordsApplication 所在的包下。

    1.3.2 @Import(AutoConfigurationImportSelector.class)
    1. 利用 getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) 给容器批量导入一些组件。
    2. 调用 List configurations = getCandidateConfigurations(annotationMetadata, attributes); 获取所有需要导入到容器中的类。
    3. 利用工厂加载 Map> loadSpringFactories(ClassLoader classLoader) 得到所有的组件。
    4. "META-INF/spring.factories" 位置开始加载文件。
      • 默认扫描我们系统里面所有 META-INF/spring.factories 位置的文件
      • 我的是 2.7.3 版本的 SpringBoot,加载的组件是写死在 spring-boot-autoconfigure-2.7.3.jar 包下的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中的。SpringBoot 一启动,就要给容器中加载该文件中的所有配置类。

    2. 按需开启自动配置项

    默认加载全部组件,最终会按需配置。

    可以使用 @ConditionalOnProperty 或者 @ConditionalOnClass 等条件注解实现按需配置。

    3. 修改默认配置

    @Bean
    // 容器中有 `MultipartResolver.class` 组件。
    @ConditionalOnBean(MultipartResolver.class)
    // 容器中没`DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME` 这个名字
    @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
    public MultipartResolver multipartResolver(MultipartResolver resolver) {
    	// 给 @Bean 注解的方法注入了对象参数,这个参数的值会从容器中找
    	// Detect if the user has created a MultipartResolver but named it incorrectly
    	return resolver;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    给容器中加入了文件上传解析器,SpringBoot 规范化,防止用户配置文件上传解析器不符合规范。

    SpringBoot 进行默认配置,若用户自定义配置,SpringBoot 就按照用户的配置加载。

    @Bean
    // 若没有该组件
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
    	CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
    	filter.setEncoding(this.properties.getCharset().name());
    	filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
    	filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
    	return filter;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. 配置流程(约定大于配置)

    • SpringBoot 先加载所有的自动配置类:xxxxAutoConfiguration
    • 每个自动配置类按照条件生效,默认都会绑定配置文件指定的值:XXXXProperties 里面拿,和配置文件进行绑定。
    • 用户有自己的配置,以用户优先
      • 用户直接自己 @Bean 替换底层的组件
      • 用户看组件获取什么 key,然后修改配置文件的值

    xxxxAutoConfiguration → \to 组件 → \to XXXXProperties → \to application.properties / application.yml

  • 相关阅读:
    element-plus中el-table合并多行如何实现
    基于javaweb+jsp的学籍管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
    数据库备份
    Jenkins nginx自动化构建前端vue项目
    【机器学习】解决过拟合、ReLU激活函数
    带你了解函数式接口编程::是什么?
    凭证管理揭秘:Cookie-Session 与 JWT 方案的对决
    植物大战僵尸各种僵尸攻略
    计算机毕业设计 SSM二手书交易系统 校园二手书交易系统 二手书籍交易平台Java
    Linux进程管理之通过pid号找到struct task_struct
  • 原文地址:https://blog.csdn.net/qq_39906884/article/details/126722011