Day14-08.SpringBoot原理-自动配置-原理分析-源码跟踪

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这个接口的实现类。

Snipaste_2024-06-28_21-29-55

ImportSelector当中有一个非常重要的方法selectImports方法,这个方法的返回值数组里面封装的就是哪些类我需要导入到Spring的IOC容器当中,里面封装的就是这些类的全类名。

我们现在就关注这个返回值数组里面封装了哪些类的全类名,这些类最终就会自动的导入到Spring的IOC容器。如下:我们最终会发现SpringBoot在启动的时候会去扫描这两个文件,而这两个文件在外面的起步依赖中都有。。。

Snipaste_2024-06-28_21-35-00

如下:可以看到,我们在起步依赖中找到了这两个文件

进去之后会发现,里面有很多类的全类名。这两份配置文件最终会被读取出来,通过@Import注解最终加载到Spring的IOC容器中成为Bean对象。并且可以看到这些类的后缀名都是AutoConfiguration,所以这些类我们也成为自动配置类。

之前我们直接注入的golson对象,没有注入可以直接使用,原因就是因为在自动配置类中做了自动配置。

会发现里面有一个@Configuration注解,那就说明当前类是一个配置类。为什么可以完成自动配置??就是因为他里面定义了一个gson方法,方法的返回值就是一个Gson类型的返回值,并且在上面加上了一个@Bean注解。此时这个类被加载到IOC容器当中,这个Bean对象自动就有了。所以我们在项目才可以直接使用@Autowird直接注入。

(2)总结

Snipaste_2024-06-28_21-45-46

我们刚刚看到imports这个文件里面定义的配置类非常非常多,而且每一个配置类当中可能定义了很多很多的Bean,是所有的Bean都会注册到Spring的IOC容器当中的吗?并不是!!

声明Bean对象的时候加了一个注解@ConditionalOnMissingBean,其实除了这个注解外还有很多@Condition开头的注解,这些注解的作用就是按条件装配,当满足一定的条件之后,我才会将这个bean注册到Spring的IOC容器当中。

多@Condition开头的注解,这些注解的作用就是按条件装配,当满足一定的条件之后,我才会将这个bean注册到Spring的IOC容器当中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值