Day14-08.SpringBoot原理-自动配置-原理分析-源码跟踪
(1)源码跟踪
我们应该从哪儿入手去分析自动配置的原理呢?
我们之前都是怎么启动SpringBoot应用的?通过启动类来启动的。这个启动类我们也称之为引导类,在这个引导类上面加了一个固定的注解@SpringBootApplication。这个注解也是SpringBoot框架当中最为重要的一个注解。我们分析自动配置的原理就直接从这个注解入手分析就可以了。
可以看到@SpringBootApplication这个注解封装了很多注解,最上面的四个注解是我们之前提到的原注解,修饰注解的注解。这四个不用看,我们看下面的三个注解就可以了。
1、先看第一个注解@SpringBootConfiguration注解:
这个注解并没有做什么事情,他只是封装了一个注解@Configuration,这个注解是用来声明配置类的。@Indexed是用来加速应用启动的,不用关心。
所以@SpringBootConfiguration这个注解就是用来声明当前类也是一个配置类。所以我们之前可以直接在启动类中来声明第三方的bean对象,原因就是因为当前这个类也是一个配置类。
2、再来看第二个注解@ComponentScan
我们前面一直提到@SpringBootApplication这个注解具有包扫描的作用,默认扫描当前包及其子包,原因就是因为下面就封装了一个注解@ComponentScan。这个注解就是进行组件扫描的注解。
3、最后一个注解@EnableAutoConfiguration
AutoConfiguration可以看出来,这个注解就是自动配置的核心注解,而Enable开头的注解我们上一小节才用过。我们提到一般Enable开头的注解他底层封装的是@Import注解,通过Import来导入指定的bean或者是配置类。
可以看到,这个@Import注解当中导入的是什么类?可以看到后缀是ImportSelector,ImportSelector是一个接口,这个类其实就是ImportSelector这个接口的实现类。
ImportSelector当中有一个非常重要的方法selectImports方法,这个方法的返回值数组里面封装的就是哪些类我需要导入到Spring的IOC容器当中,里面封装的就是这些类的全类名。
我们现在就关注这个返回值数组里面封装了哪些类的全类名,这些类最终就会自动的导入到Spring的IOC容器。如下:我们最终会发现SpringBoot在启动的时候会去扫描这两个文件,而这两个文件在外面的起步依赖中都有。。。
如下:可以看到,我们在起步依赖中找到了这两个文件
进去之后会发现,里面有很多类的全类名。这两份配置文件最终会被读取出来,通过@Import注解最终加载到Spring的IOC容器中成为Bean对象。并且可以看到这些类的后缀名都是AutoConfiguration,所以这些类我们也成为自动配置类。
之前我们直接注入的golson对象,没有注入可以直接使用,原因就是因为在自动配置类中做了自动配置。
会发现里面有一个@Configuration注解,那就说明当前类是一个配置类。为什么可以完成自动配置??就是因为他里面定义了一个gson方法,方法的返回值就是一个Gson类型的返回值,并且在上面加上了一个@Bean注解。此时这个类被加载到IOC容器当中,这个Bean对象自动就有了。所以我们在项目才可以直接使用@Autowird直接注入。
(2)总结
我们刚刚看到imports这个文件里面定义的配置类非常非常多,而且每一个配置类当中可能定义了很多很多的Bean,是所有的Bean都会注册到Spring的IOC容器当中的吗?并不是!!
声明Bean对象的时候加了一个注解@ConditionalOnMissingBean,其实除了这个注解外还有很多@Condition开头的注解,这些注解的作用就是按条件装配,当满足一定的条件之后,我才会将这个bean注册到Spring的IOC容器当中。
多@Condition开头的注解,这些注解的作用就是按条件装配,当满足一定的条件之后,我才会将这个bean注册到Spring的IOC容器当中。