SpringBoot自动装配原理

  SpringBoot自动装配原理


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

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

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

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

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

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

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

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

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

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

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

比如说这里:

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

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

总结:

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

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

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

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

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

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

相关推荐

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

    2024-03-31 16:52:04       38 阅读
  2. springboot 自动装载原理

    2024-03-31 16:52:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 16:52:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 16:52:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 16:52:04       82 阅读
  4. Python语言-面向对象

    2024-03-31 16:52:04       91 阅读

热门阅读

  1. 物联网如何改善农业生产和作物管理

    2024-03-31 16:52:04       41 阅读
  2. 算法3&4_数据结构&数组和链表

    2024-03-31 16:52:04       37 阅读
  3. 15.三数之和

    2024-03-31 16:52:04       41 阅读
  4. 【Golang】switch 语句和select 语句有什么区别?

    2024-03-31 16:52:04       35 阅读
  5. RM雷达站数据集汇总&雷达站开源

    2024-03-31 16:52:04       38 阅读
  6. 计算机网络面试题

    2024-03-31 16:52:04       40 阅读