@SpringBootApplication (自动配置) 源码分析

今天咱们来看看SpringBoot入口上的一个注解@SpringBootApplication。

注:我使用的SpringBoot版本是3.2.4,不同版本之间可能会有差异,但是并不大。

来咱们点进去这个@SpringBootApplication注解会发现三个主要注解@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan,@ComponentScan这个就是包扫描,这里就不展开讲了。

咱们先来看看@SpringBootConfiguration这个注解,字面意思SpringBoot配置,点进去会发现里面有一个@Configuration注解,点进@Configuration会发现里面是一个@Component组件注解,说明这个就是一个组件。

再来看看剩下的@EnableAutoConfiguration 开启自动配置 这个才是今天咱们的重头戏。来,咱们点进去会发现有两个重要的注解@AutoConfigurationPackage 自动配置包 和@Import(AutoConfigurationImportSelector.class) 导入 自动配置导入查询 这个类。

咱们先看@AutoConfigurationPackage 自动配置包 ,点进去会发现里面是一个@Import(AutoConfigurationPackages.Registrar.class) 导入 自动配置包的注册类。

联想之前的注解 @Import(AutoConfigurationImportSelector.class) 导入 自动配置导入查询 这个类 ,就是把这个查询到的类注册到SpringBoot里面。

咱们再来看看注解 @Import(AutoConfigurationImportSelector.class) 导入 自动配置导入查询 这个类 ,咱们点进AutoConfigurationImportSelector.class这个类。

可以看到AutoConfigurationImportSelector这个类的变量比如environment环境,beanClassLoader类加载器,resourceLoader资源加载器以及configurationClassFilter配置类过滤器。咱们先来看它的第一个方法selectImports查询导入的。查询导入的什么?当然是配置啦!

来咱们看看它是怎么查的,它调了一个getAutoConfigurationEntry() 获取自动配置实体 方法。来咱们进去看看。

它先通过getAttributes()获取了属性,这个咱们先不管它,继续往下看。它掉了getCandidateConfigurations() 获取候选配置 方法,咱们点进去看看它是怎么获取配置的。

可以看到ImportCandidates 导入候选者 这个类加载了AutoConfiguration这个注解(记住这个,后面会用到!!!),来咱们点进load()方法看看它是怎么加载的。

可以看到,它先断言annotation不为空,然后用decideClassloader()方法对classLoader为null时做了处理,在之后他加载了 LOCATION 这个文件,再之后它便循环把这个文件里面的东西读出来导入候选了。来让我们看看LOCATION。

可以看到这个常量指到了META-INF/spring/%s.imports这个文件,来咱们来看看这个文件里有什么。之前我们使用过AutoConfigurationImportSelector类的下的getCandidateConfigurations中的ImportCandidates.load()进来的,咱们来到这个AutoConfigurationImportSelector这个类,定位到它的包。

注意不要找错包了。可以发现符合条件的只有org.springframework.boot.autoconfigure.AutoConfiguration.imports这个文件,来让我们看看这个文件里面究竟有什么。

里面有一堆的配置类,甚至还包括了我们没有导入的依赖,由此可以看出SpringBoot在启动的时候就把所有的配置类导入进来了。但是我们并没有用到啊?他是怎么排除的呢,来让我们点进一个没导入依赖的配置类,来咱们进入org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration这个配置类。

可以看到里面第一个注解就是@AutoConfiguration,熟悉不熟悉,没错,就是之前加载的时候用到的。再来看看@ConditionalOnClass({ MongoClient.class, MongoTemplate.class })这个注解,Conditional是 有条件的 的意思,并且后面的两个类还是红色的,这个注解的意思是这些类的条件有没有被满足。SpringBoot就是通过这个注解来判断是不是导入这个配置类的。以及@ConditionalOnBean等类似的注解也是一样的作用。

OK,今天的@SpringBootApplication分析到此结束,如果感觉还不错,可以点个关注。

  • 44
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值