文章目录
前言
SpringBoot自动装配原理是面试中的难点,如果不抓住重点直接看源码很可能会迷失方向。本章结合SpringBoot源码,带大家剖析一下SpringBoot自动装配原理,希望能给读者带来帮助。
一、@SpringBootApplication
SpringBoot的自动装配是指:SpringBoot会自动将一些配置类的bean注册到ioc容器,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。
@SpringBootApplication注解是SpringBoot的核心注解,它其实是一个组合注解,包括三个注解,按住Ctrl+鼠标左键,进入注解内部。
从上图可以发现@SpringBootApplication这个注解是由@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解组成,接下来逐一介绍每个注解的功能。
二、@SpringBootConfiguration注解
首先我们来看一下@SpringBootConfiguration注解,进入内部,发现@SpringBootConfiguration这个注解的本质就是@Configuration注解。而@Configuratin注解是Spring框架提供的,表示当前类是一个配置类。
注意:@SpringBootConfiguration注解和 @Configuratin注解都是标识一个可以被组件扫描器扫描的配置类,只不过前者是被Spring Boot进行了重新的命名和封装。
三、@EnableAutoConfiguration注解
进入@EnableAutoConfiguration,发现其也是一个组合注解,由@AutoConfigurationPackage和
@Import({AutoConfigurationImportSelector.class})注解组成。
3.1@AutoConfigurationPackage注解
1.该注解上有一个@Import(AutoConfigurationPackages.Registrar.class)注解,点击Registrar进入内部
2.registerBeanDefinitions()方法
从上图可以看出@AutoConfigurationPackage注解的作用就是获取项目启动类的根目录,从而指定后续组件扫描器要扫描的包位置。因此这就是为什么将controller、service等包放在启动类的同级目录下的原因。
3.2@Import({AutoConfigurationImportSelector.class})注解
1.点击AutoConfigurationImportSelector进入内部
2.getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)方法
四、@ComponentScan注解
一个组件包扫描器,用于将指定包中的注解类自动装配到Spring的Bean容器中。
@ComponentScan注解具体扫描的包的根路径由Spring Boot项目启动类所在包位置决定,在扫描过程中,
由@AutoConfigurationPackage注解进行解析,从而得到Spring Boot项目启动类所在包的具体位置。
总结
@SpringBootApplication本质:三个注解的整合,三个注解的功能以及结构如下图所示。