SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解
-
@Import注解
- @Enable* 底层依赖于 @Import 注解导入一些类,使用 @Import 导入的类会被 Spring 加载到 IOC 容器中
- @Import 提供了4种用法:
- 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.coloradmin.cn/o/352621.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!