当前位置: 首页 > news >正文

SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解

  • @Import注解

  • @Enable* 底层依赖于 @Import 注解导入一些类,使用 @Import 导入的类会被 Spring 加载到 IOC 容器中
  • @Import 提供了4种用法:
    • 1.导入Bean
    • 2.导入配置类
    • 3.导入ImportSelector实现类;一般用于加载配置文件中的类
    • 4.导入ImportBeanDefinitionRegistrar实现类
  • @EnableAutoConfiguration注解

  • 可以看看Spring是如何使用@Import 注解的:
  • 进入引导类上的@SpringBootApplication 注解可以看到其注解依赖

  • @EnableAutoConfiguration 注解
  • 进入 @EnableAutoConfiguration 注解可以看到它使用了 @Import 注解导入了 AutoConfigurationImportSelector 这个自动配置的 Selector

  • 进入 AutoConfigurationImportSelector 之后可以找到 selectImports 方法,根据上文所述,这个方法返回了一个 String 类型的数组,数组中定义了很多需要被加载的类

  • 进入加载方法可以看到有一个getCandidateConfigurations方法会返回一个名为 configurations 的 List 集合,在下面的代码中根据条件筛选了这个集合并放入创建的 AutoConfigurationEntry 中返回

  • 进入 getCandidateConfigurations 可以看到他通过 SpringFactoriesLoader 加载了一些配置信息并返回了一个名为 configurations 的 List 集合
  • 下面的断言表示如果这个集合为空的,那么就会出现异常,大概意思为:“不能自动配置一个 claesses,在 META-INF 目录下的 spring.factories 文件下”,如果没有定义 spring.factories 这个文件,那么他就加载不到,加载不到就会出现断言

  • 接下来在 External Libraries 中找到 org.springframework.boot:spring-boot-autoconfigure:2.6.1 下的spring-boot-autoconfigure-2.6.1.jar -> META-INF -> spring.factories 并进入

  • 可以看到这个配置文件中有一个 key 为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 的配置,其中配置了许多的 Configuration,那么这些 Configuration 将来都会被加载
  • 当然这些 Configuration 能否加载出来还得看他们的条件是否满足,比如可以找到前面讲到的 Redis,Redis 在当前配置文件中有一个 RedisAutoConfiguration

  • 进入 RedisAutoConfiguration 可以看到其中有一个 @ConditionalOnClass 条件注解,当这个注解里的条件被满足时,这个类中的 Bean 才会被创建

  • 当然不止这一个会有条件注解,再随便挑一个进去看看:
  • 在 KafkaAutoConfiguration 中同样定义了条件注解,当环境中存在 KafkaProperties 时,这个类中的 Bean 才会被加载

  • 小结:
  • @EnableAutoConfiguration 注解内部使用 @Import(AutoconfigurationImportSelector.class) 来加载配置类
  • 配置文件位置:META-INF/spring.factories
  • 该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化 Bean
  • 并不是所有的 Bean 都会被初始化,在配置类中使用 Condition 来加载满足条件的 Bean
http://www.lryc.cn/news/10322.html

相关文章:

  • 【笔记】C#一维数组、多维数组和交错数组的区别总结
  • 【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪
  • 【设计模式】创建型模式
  • Spark Catalyst 查询优化器原理
  • 贝叶斯分析法在市场调研中的应用
  • JavaEE——MyBatis将查询结果集封装进POJO实体类
  • C++11 包装器function
  • XCP实战系列介绍14-基于Vector_Davinci工具的XCP配置介绍(三)
  • 计算机图形学:中点BH算法对任意斜率的直线扫描转换方法
  • (十一)、用户中心页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
  • LA@复数和复矩阵@实对称阵相关定理
  • cmd set命令笔记
  • IB学校获得IBO授权究竟有多难?
  • 火山引擎 DataTester:A/B 测试,让企业摆脱广告投放“乱烧钱”
  • 黑马redis学习记录:缓存
  • CD20靶向药物|适应症|市场销售-上市药品前景分析
  • 多源 复制
  • 微服务项目【消息推送(RabbitMQ)】
  • vr电力刀闸事故应急演练实训系统开发
  • C++类和对象补充
  • 08 SpringCloud 微服务网关Gateway组件
  • 极验3代 加密分析
  • python 数据分析可视化实战 超全 附完整代码数据
  • 有趣的HTML实例(十三) 咖啡选择(css+js)
  • 【力扣-LeetCode】1139. 最大的以 1 为边界的正方形 C++题解
  • 【JavaGuide面试总结】Redis篇·下
  • ForkJoinPool原理
  • 02 python基本语法和数据类型
  • 【办公类-16-09】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)
  • 全网多种方法分析解决HTTP Status 404资源未找到的错误,TCP的3次握手,dns域名解析,发起http请求以及cookie和session的区别