自动装配是什么
SpringBoot自动配置说白了就是:当Spring容器启动时,一些配置类、bean对象就自动存入IOC容器中,不在需要我们手动声明,从而简化了开发,省去了繁琐的配置操作。
这里的
SpringApplication
是允许使用懒加载方式初始化。当启用懒初始化时,Bean在需要时被创建,而不是在应用程序启动时。
源码分析
启动类上注解
@SpringBootApplication:这是一个组合注解(多个注解组成),当类上标注这个注解的时候,说明项目是由这个类下的man()方法启动运行。他是SpringBoot项目中最重要的注解。
接下来点进去看看这个注解是由那些注解组成。
从这里可以看出该注解主要是由三个注解组成
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
- 上面其他的为元注解
@SpringBootConfiguration
这个直接在类中标注可带边该类为配置类。原因如下:
点开该注解可以看到里面有 @Configuration 注解,在点开 @Configuration 注解
这时候可以看见里面有 @Component 注解,所以这个注解标注在那个类上面那个类就是配置类,我们平时自定义配置类一般都使用 @Component、@Configuration 注解,因此就会添加组件到IOC中。
@EnableAutoConfiguration
该注解主要用于开启自动配置的功能与@ComponentScan共同使用,点开该注解后可以看见里面主要包含了两个注解:
@AutoConfigurationPackage作用:扫描 @ComponentScan 注解指定路径包下面的类,以及我们自定义的配置类、子文件夹中的配置类,加载到容器ioc中
@Import(AutoConfigurationImportSelector.class):将需要自动装配的类以全类名的方式返回,加载到容器中(具体是怎么找到,并且返回的后文介绍)。
@ComponentScan
主要作用:包扫描,默认扫描位置是 SpringBoot 主启动类所在位置以及子包,由上面的 @EnableAutoConfiguration 中的 @AutoConfigurationPackage 注解解析获取到启动类所在的包路径。
注意:这里也就是为什么不论是 Controller类还是 Service类,所在位置都要放在主启动类同级或同级下的包中才可以被扫描到。
总结
- 项目启动最主要的注解是启动类上的 @SpringBootApplication
- @SpringBootApplication 主要有三个注解组成,三个注解分别有各自的功能。
- 项目中自定义配置文件等都要放在主启动类同级包或者下级包中配置
寻找自动装配类
接下来就看下项目启动时,是怎么找到需要自动装配的类
1.点开 AutoConfigurationImportSelector 类
AutoConfigurationImportSelector 可以帮助 SpringBoot 应用将所有符合条件的配置都加载到当前容器中。
通过类中的 selectImports() 这个方法,让SpringBoot 知道需要去导入那些组件
2.找到里面的 selectImports(AnnotationMetadata annotationMetadata) 方法
3.点开 getAutoConfigurationEntry(annotationMetadata) 方法
4.方法中又调用了 getCandidateConfigurations(annotationMetadata, attributes) 方法,点开
获取一个自动配置 List ,这个 List 就包含了所有的自动配置的类名
5.方法中又调用了 SpringFactoriesLoader.loadFactoryNames(param1,param2) 方法,点开
6.方法中调用 loadSpringFactories(classLoader) ,点开
7.找到方法后我们就可以看见里面的 FACTORIES_RESOURCE_LOCATION ,还是点开
8.最终我们就可以找到这个路径
因此最重要的就是 第6步的 loadSpringFactories(classLoader) 方法,这个方法就是为了找到 META-INF 路径下的 spring.factories 文件,然后找到 EnableAutoConfiguration 为key的值返回,我们可以找到这个文件看看里面都有什么东西。
到此本文就结束了,我目前也是处于学习阶段,以上就是我总结的自动装配原理。有什么不对的地方,还请大家留言评论,一起学习进步。
如果对于为什么会自动找到需要装配的类不理解,推荐一片文章可以去学习一下,大佬将注释都已经在源码中打好了
【Spring Boot原理篇】SpringBoot自动装配原理详解(面试高频!)_面试问springboot自动装配原理-CSDN博客