浅谈SpringBoot自动装配

引言

相信大家在学习Spring的时候都被XML支配过,XML配置Bean不仅繁琐而且还特别容易配置错。

我们都知道Spring支持Bean的配置方式可以分为三种:基于XML文件配置、javaConfig以及隐式的Bean发现机制和自动装配。本文章主要讲解SpringBoot自动装配原理。

注解@SpringBootApplication

每一个SpringBoot项目上不可少的Bean,也是程序的驱动类。

注解@SpingBootApplication拆解

包含三个重要的注解

  • @SpringBootConfiguration:该注解和@Configuration注解一样,都是用来声明当前Bean是一个配置类,也是通过JavaConfig的方式配置。
  • @ComponentScan:该注解用来对组件进行扫描,默认扫描当前引导类所在包及其子类。
  • @EnableAutoConfiguration:SpringBoot实现自动装配的核心注解。

注解 @EnableAutoConfiguration 的追踪   (重点!!)

我们进入源码观察,发现有一个@Import注解,引用了AutoConfigurationImportSelector.class类 。意思就是选择我们要导入的自动配置的选择器。

 在AutoConfigurationImportSelector.class中存在着以下方法。

  • selectImports,这个方法就是Springboot获取选择器的入口。这个方法的返回值是一个数组,返回需要加载的Bean类名。

  • 注意在selectImports方法中存在一个获取自动配置类的列表(本人认为是这样),查看此方法,发现调用了一个名为getCandidateConfigurations的方法,这个方法可以理解为获取哪些类在等待装配。注意该方法的返回值为String数组,该方法是获取等待装配的类的类名。

  • 进入getCandidateConfigurations中可以看到SpringFactoriesLoader方法,同时注意传入的参数this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader(),可以认为这个方法是加载工厂加载配置类的,这时我们需要再进入到loadFactoryNames这个方法中去查看加载哪些配置类和工厂。

  •  loadFactoryNames,在这个方法中我们可以看到,出现了一个loadSpringFactories并且返回值为List,进入loadSpringFactories中我们发现classLoader加的是METINF/spring.factories文件中的资源。

  • 查看META-INF/spring.factories文件
  •  在org.springframework.boot.autoconfigure.EnableAutoConfiguration后面的内容中,Spring已经默认提供一百多个类,会被加载到容器中。

 自动装配类的追踪

  •  以RedisAutoConfiguration为例,进入RedisAutoConfiguration配置类,首先我们就看到这是一个配置类。

  •  其次观察是否有RedisOperations的字节码,当我们导入了Redis的相关依赖的时候,这个字节码就会存在。如果存在的话,就回去加载name为redisTemplate的Bean,同时放到容器中。

总结

自动装配的重点就是@EnableAutoconfiguration注解。该注解通过@Import导入了对应的配置选择器。简单来说就是读取了META-INF/spring.factories文件中所配置的类的全类名。而在加载这些类的时候会根据所指定的条件决定是否导入Spring容器中。例如@ConditionalClass,就是判断时候有对应的class文件,然后决定是否加载该Bean放入到Spring容器中。以上内容是个人的一些理解,欢迎大家交流!

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值