引言
相信大家在学习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容器中。以上内容是个人的一些理解,欢迎大家交流!