SpringBoot的自动装配原理

本文详细解析了SpringBoot启动类上的@SpringBootApplication注解,它实际上包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。@EnableAutoConfiguration通过@Import导入配置选择器,依据spring.factories文件中的条件注解动态装配Bean。
摘要由CSDN通过智能技术生成

 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容器 中使用。

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值