【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?

SpringBoot源码下载地址:https://github.com/spring-projects/spring-boot/tags

文章目录

    • 下载源码
    • 环境准备
    • 注解解析
      • @SpringBootConfiguration注解
      • @EnableAutoConfiguration注解
      • @AutoConfigurationPackage注解
      • @ComponentScan注解
    • 所以这篇博客解决了标题的问题
      • @SpringBootApplication注解的作用是什么?
      • SpringBoot怎么实现自动装配的?

下载源码

我们下载2.2.9.RELEASE版本,2.3.0以上版本需要用gradle构建

解压完之后运行maven安装命令

mvn clean install -DskipTests

环境准备

在springboot源码项目下创建一个新的模块,这样方便我们debug源码

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第1张图片

注解解析

点进去我们可以看到一共有七个注解

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第2张图片
上面四个是java原生的注解,我们不用管它

@SpringBootConfiguration注解

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第3张图片

它的作用就是标识springboot启动类为bean

@EnableAutoConfiguration注解

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第4张图片

该注解是启动自动装配的功能,这就是springboot能自动装配的核心

@AutoConfigurationPackage注解

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第5张图片

@Import注解是spring中的注解,这里不再赘述他的作用,这里面导入了一个AutoConfigurationPackages.Registrar.class
Registrar静态内部类

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第6张图片

register方法

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第7张图片

所以AutoConfigurationPackage注解的目的是将BasePackages类注册进ioc中

再回到@EnableAutoConfiguration注解的import注解中

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第8张图片

AutoConfigurationImportSelector类

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第9张图片

他实现了很多的Aware接口,Aware接口的作用就是回调函数,他在spring运行的过程中会调用他的接口方法并且将入参赋值给子类的成员变量

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第10张图片

我们进入到该类的process方法中

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.AutoConfigurationGroup#process

在执行的过程中会回调改方法

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第11张图片

进入完成装配的方法getAutoConfigurationEntry

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第12张图片
【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第13张图片

org.springframework.boot.autoconfigure.EnableAutoConfiguration,待会要拿的key值

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第14张图片

要取的文件

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第15张图片

所以getAutoConfigurationEntry方法里面的getCandidateConfigurations方法获取了
META-INF/spring.factories文件中的key(org.springframework.boot.autoconfigure.EnableAutoConfiguration)值

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第16张图片

我们去看看所有key是META-INF/spring.factories文件

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第17张图片

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第18张图片

这些全限定类名就是自动装配的关键

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第19张图片

我们不可能把124个bean注册到ioc中,所以我们经过一系列的过滤得到了最终的23个bean
而去除这些bean的关键就是下面这段代码


		//去除不需要注册的bean
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);

其中最重要的方法是filter方法

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第20张图片

我们举个例子,去看一下RabbitAutoConfiguration类

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第21张图片

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第22张图片

@ConditionalOnClass注解中没有满足classpath目录(pom文件导入jar)下有RabbitTemplate.class, Channel.class 类的即不装配
还有很多内置spring的@Conditional注解的springboot注解

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第23张图片
【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第24张图片

关于条件注解的讲解
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
·@ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
·@ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean。
·@ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean。基于SpEL表达式的条件判断。
·@ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
·@ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。

剩下createBean就交给spring去处理就好了

@EnableAutoConfiguration注解已经讲完了

@ComponentScan注解

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第25张图片
常用属性如下:

·basePackages、value:指定扫描路径,如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径
·basePackageClasses:指定具体扫描的类
·incIudeFiIters:指定满足FiIter条件的类
·excludeFilters:指定排除FiIter条件的类

因为@ComponentScan注解没有basePackages、value属性,所以springboot会默认扫描启动类所在的包

所以这篇博客解决了标题的问题

@SpringBootApplication注解的作用是什么?

  1. @SpringBootConfiguration注明该类为配置类
  2. @EnableAutoConfiguration完成自动装配
  3. @ComponentScan完成扫描路径

SpringBoot怎么实现自动装配的?

  1. 通过 @EnableAutoConfiguration注解找到所有的META-INF/spring.factories文件
  2. 拿到key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的value
  3. 去除掉不符合条件的bean,满足@Conditional注解等信息的bean才会注册
  4. 在run方法中注册符合条件的bean,run方法会扫描@SpringBootApplication里面的信息,从而注册进入ioc(重要,因为run方法才能使@SpringBootApplication注解生效)

得到了一个规律:

几乎所有自动配置类都叫xxxAutoConfiguration

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第26张图片

而在yaml或者properties文件中配置的key都是xxxProperties

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第27张图片
码文不易,多多点赞

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?_第28张图片

你可能感兴趣的:(spring,boot,面试,java)