SpringBoot的自动装配原理

 SpringBoot自动装配原理


82e4baaf5dce4c24b266e79ea10a207e.png

SpringBoot的启动类上有一个注解:@SpringBootApplication 。该注解是三个注解的复合注解。

 1.@SpringBootConfiguration 注解
点进@SpringBootConfiguration 注解,可以发现其核心注解为@Configuration注解:

edef94eb4d2c4a9db80fd47dae53fcfe.png

@Configuration是一个类级别的注释,表明一个对象是 bean 定义的来源。@Configuration类通过带@Bean注解的方法声明 bean 。@Bean对@Configuration类方法的调用也可用于定义 bean 间的依赖关系
@Configuration在spring的注解开发中占有很重要的地位,你当你想要定义一个配置类并交给spring管理的时候你就可以在相关类上面加这个注解,并配合@Bean注解把对象交个spring去管理。

所以@SpringBootConfiguration 注解本质上就是一个@Configuration注解,用来标注某个类为 JavaConfig 配置类,有了这个注解就可以在 SpringBoot 启动类中使用```@Bean``标签配置类了,如下图所示。a7a0a2ef50e4456093c9dd84812a7d28.png

2.@ComponentScan 注解
@ComponentScan是Spring注解之一,用于在Spring应用程序上下文中启用组件扫描。组件扫描是自动检测和注册 Spring bean(组件)到应用程序上下文中的过程。

这个扫描的范围是:SpringBoot 主启动类的同级路径及子路径,扫描到特定的@Component、@Service、@Controler、@Repository、@Configuration等等注解后,会做相应的bean注册和配置文件bean注册工作。

3.@EnableAutoConfiguration 注解
点进这个注解可以发现 @Import(AutoConfigurationImportSelector.class),如下图所示。

f309e57f72244a5c98f9910a893940d9.png

@Import是Spring注解之一,用于在配置类中导入其他配置类或者普通的Java类。

通过@Impor注解,我们可以将其他配置类或者普通的Java类导入到当前配置类中,从而实现对这些类的引用和使用。可以用于将多个配置类组合在一起,或者引入第三方库中的配置类。

说白了在这里@Import注解的作用就是将 AutoConfigurationImportSelector 这个类导入当前类,这个类就是实现自动装配的核心。在这里它会加载spring.factories文件。文件里面的内容也会统一加载到spring容器中。

spring.factories中的这一百多个配置类,是否生效也是有一定条件的。

476d437dfac842c6938fa595d55c4f32.png

比如说这里:

@ConditionalOnClass:说明要导入相关依赖当前配置类才会生效。

@ConditionalOnMissingBean:说明当前spring容器没有创建redisTemplate对象(某些情况我们要手动定制一些bean),它才会创建该对象放入spring容器中管理。

a0761fa180994797b94621fe26769ac8.png

总结:

        在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

其中 @EnableAutoConfiguration 是实现自动化配置的核心注解。

该注解通过 @Import 注解导入对应的配置选择器。关键的是内部就是读取了 该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。

在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要 将其导入到Spring容器中。

一般条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的 class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器 中使用。

相关推荐

  1. 02--SpringBoot自动装配原理

    2024-04-29 15:02:04       10 阅读
  2. springboot 自动装载原理

    2024-04-29 15:02:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-29 15:02:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-29 15:02:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-29 15:02:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-29 15:02:04       20 阅读

热门阅读

  1. RequestMapping注解

    2024-04-29 15:02:04       22 阅读
  2. Windows 系统中常用的命令提示符(CMD)命令

    2024-04-29 15:02:04       13 阅读
  3. C++ 指针

    2024-04-29 15:02:04       11 阅读
  4. 第四章:c语言中的循环结构

    2024-04-29 15:02:04       14 阅读
  5. MATLAB 2016计算NDVI

    2024-04-29 15:02:04       17 阅读
  6. 八、Python+FFmpeg,实战直播推流

    2024-04-29 15:02:04       11 阅读
  7. C语言-嵌入式-STM32:有哪些接口协议?

    2024-04-29 15:02:04       13 阅读
  8. Mac shell 环境变量配置

    2024-04-29 15:02:04       9 阅读