springboot如何自动导入Configuration
发布日期:2021-05-10 03:42:14 浏览次数:26 分类:精选文章

本文共 2555 字,大约阅读时间需要 8 分钟。

在理解Spring Boot的自动化配置特性时,一个关键的组件是AutoConfigurationImportSelector类,它负责根据注解元数据和应用环境条件,动态地导入适用于当前环境的自动化配置类。以下是对这一机制的详细分析和总结:

AutoConfigurationImportSelector的核心作用

  • 实现了ImportSelector接口:该类的作用是根据指定的条件,生成能够导入到Spring容器中的配置类集合。这些配置类通常带有@EnableAutoConfiguration注解或其他条件注解,如@ConditionalOnClass,用于在满足特定条件时生效。

  • 利用注解元数据:通过AnnotationMetadata获取启动类上的注解信息,特别是org.springframework.boot.autoconfigure.EnableAutoConfiguration注解所在的类以及相关的注解属性。这些信息帮助在决定导入哪些配置类时更加准确和高效。

  • 获取候选配置类:调用getCandidateConfigurations方法,结合注解元数据和应用环境属性,筛选出所有满足条件的自动化配置类候选项。这些候选期分为应用上下文中具有可执行条件的配置。

  • 加载配置工厂:使用SpringFactoriesLoader来获取已经加载的工厂类,并解析配置文件中的配置信息。这些配置通常存储在META-INF/spring.factories等文件中,用于导入具体的自动化配置类。

  • 分析和筛选配置类

    • 检查是否有重复的配置类,确保每个配置类在容器中只出现一次。
    • 获取排除配置类的集合,进行反向筛选,确保仅导入满足条件且没有被禁用的配置类。
    • 进行过滤,基于用户定义的过滤器,进一步限制导入范围。
    • 触发自动化配置导入事件,以便更新进度和处理异常。
  • 生成配置项集合:整合上述步骤的结果,生成最终要导入Spring容器的配置类集合。这些配置类将根据环境条件和其他注解,决定是否真正被装入容器。

  • 自动化配置类的启用条件

    • @Conditional注解:通过多种条件注解(如@ConditionalOnClass@ConditionalOnSingleCandidate@ConditionalOnProperty等)来决定配置类是否生效。例如,某个配置类仅在特定数据库类型的环境中才会被启用。
    • @AutoConfigureAfter:指定一个已知的配置类的顺序,确保当前配置类在已经完成另一个配置类之后被导入。
    • @Import:直接导入需要配置的容器组件。可以单独导入或多个配置类进行批量导入。
    • @EnableConfigurationProperties:将配置文件中的键值对映射到复合类型的属性源中,例如JdbcProperties中定义的数据库配置参数。

    配置文件的作用

    默认情况下,Spring Boot会从META-INF/spring.factories文件中获取自动化配置的工厂名称。这一文件通常包含以下内容:

    # Auto Configuration Import Listeners
    org.springframework.boot.autoconfigure.condition ortadan置于 replier , post

    文件中的每条注释都指明了一个具体的自动化配置类或配置组件,这些会被Spring Boot自动加载。配置文件中还可能包含多个不同的配置条目,每条条目都可能引入不同的自动化配置类,具体的配置类取决于项目需求和环境。

    实际应用中的示例

    JdbcTemplateAutoConfiguration为例:

    @Configuration
    public class JdbcTemplateAutoConfiguration {
    @ConditionalOnClass({JdbcTemplate.class})
    @ConditionalOnSingleCandidate(DataSource.class)
    @AutoConfigureAfter(DataSourceAutoConfiguration.class)
    @EnableConfigurationProperties(JdbcProperties.class)
    @Import({JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class})
    public class JdbcTemplateAutoConfiguration {
    // 配置逻辑和Bean方法...
    }
    }
    • @ConditionalOnClass:确保系统中有JdbcTemplate类,否则该配置不会生效。
    • @ConditionalOnSingleCandidate:确保只有单个DataSource实现被使用,避免冲突。
    • @AutoConfigureAfter:让该配置在DataSourceAutoConfiguration之后被处理,确保数据源已正确配置。
    • @EnableConfigurationProperties:将JdbcProperties中的配置绑定到容器,方便通过配置文件进行定制化配置。
    • @Import:直接导入JdbcTemplateConfigurationNamedParameterJdbcTemplateConfiguration,确保相应的jdbc模块被配置进容器。

    总结

    Spring Boot的自动化配置机制通过AutoConfigurationImportSelector类的核心方法,结合配置文件和丰富的注解条件,灵活地为应用装配所需的功能模块。用户只需在主启动类中注明需要启用的自动化配置类,Spring Boot会根据环境和需求自动处理配置的生效顺序、条件检查以及组件的导入,是一个高效且灵活的配置中心。通过理解和运用这些机制,开发者可以更高效地配置和管理Spring Boot应用,充分发挥自动化配置的优势。

    上一篇:基于filter做日志收集处理(仅限请求层)基于过滤器实现
    下一篇:springboot使用@EnableCaching实现缓存的使用

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月26日 20时44分10秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    el-table select事件判断当前项是否勾选 2025-03-29
    Elasticsearch & Kibana & Filebeat开启SSL通信 2025-03-29
    ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案 2025-03-29
    ElasticSearch - 分布式搜索引擎底层实现——倒排索引 2025-03-29
    ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点) 2025-03-29
    ElasticSearch - 基于 docker 部署 es、kibana,配置中文分词器、扩展词词典、停用词词典 2025-03-29
    ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合 2025-03-29
    ElasticSearch - 基于 JavaRestClient 操作索引库和文档 2025-03-29
    ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮) 2025-03-29
    ElasticSearch - 基于 “黑马旅游” 案例,实现搜索框、分页、条件过滤、附近酒店、广告置顶功能 2025-03-29
    20241012更新_yum install 找不到合适的yum源_yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067 2025-03-29
    ElasticSearch - 基础概念,以及和 mysql 的对比 2025-03-29
    ElasticSearch - 索引库和文档相关命令操作 2025-03-29
    elasticsearch 7.7.0 单节点配置x-pack 2025-03-29
    ElasticSearch 中 REST API 详解 2025-03-29
    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制) 2025-03-29
    Elasticsearch 时区问题 2025-03-29
    Elasticsearch 索引字段类型为text,添加keyword类型操作 2025-03-29
    Elasticsearch(四) es出现的问题:填坑 2025-03-29
    elasticsearch-5.1.1 安装的问题 2025-03-29