相关阅读
第一个SpringBoot项目与依赖注入的详解
前言
@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该允许这个类的main方法来启动SpringBoot应用。
那么它背后的原理是怎样的呢?
1.点击进入@SpringBootApplication你会发现两个重要的注解
@SpringBootConfiguration和@EnableAutoConfiguration
2.对@SpringBootConfiguration的解析
再往里点的话
小结: @SpringBootConfiguration:SpringBoot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类 它的底层其实也是@Configuration表示这是一个配置类,而它的再底层其实是@Component(配置类---->配置文件;所以配置类其实也是容器中的一个组件)
3.对@EnableAutoConfiguration的解析
这里其实是@AutoConfigurationPackage和@Import({EnableAutoConfigurationImportSelector.class})
3.1 @AutoConfigurationPackage:表示扫描自动配置包,也就是标注了@SpringBootApplication所在包及下面的所有子包里面所有的组件扫描到Spring容器
实现机制:
3.2 @Import({EnableAutoConfigurationImportSelector.class})的作用是导入组件的选择器。该选择器是将所有需要导入的组件以全类名的方式返回,这些组件会被添加到容器中。会给容器导入非常多的自动配置类(xxxAutoConfiguration):就是给容器中导入这个场景所有的组件,并配置好这些组件。
实现机制:
1)如上图所示,我们返回了一个注解信息的数组,只要我们在57行打上断点,并进入Debug模式我们会发现configurations数组中的值为
2) 那我们是如何获取这些配置类信息的呢?
它是通过上面方法的64行
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);去获取候选的配置文件
2.1) 点击进入getCandidateConfigurations( )该方法
上面方法中的第95行
List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
这个方法中的this.getSpringFactoriesLoaderFactoryClass()表示的类是EnableAutoConfiguration.class;
而 this.getBeanClassLoader()则是一个类加载器