小言_互联网的博客

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

582人阅读  评论(0)
  • @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

转载:https://blog.csdn.net/weixin_59624686/article/details/129092217
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场