前言
SpringBoot 就是一个基于spring的一个框架。提供了一些自动配置的依赖包,自动嵌入servlet的容器,简化了我们开发的配置,提升开发人员的开发效率,并解决了包依赖的问题。SpringBoot有两个最核心的特点就是:版本控制、自动配置 而我们今天就是重点来讲解一下自动配置的过程
一、了解SpringBootApplication
如果我们的类上有这个SpringBootApplication注解,那么就表示这个类是我们的主启动类,相当于工程的入口,这里可以按住 Ctrl+左键 点击进去查看一下里面的注解信息
二、@SpringBootConfiguration理解
1.点进@SpringBootConfiguration 查看一下
2.Java的配置类有一个特点 就是这个类下可以使用@Bean注解 来注册对象到容器中
三、@ComponentScan理解
1.这个注解相信大家也是非常的熟悉吧,他的作用的是扫描指定的包下所有的注解 将这些注解下的类实例化并注册到容器中
2.看一下我们代码里面的@ComponentScan 发现他并没有指定扫描哪个包 那么在这里给大家说一下 如果没有指定扫描路径 那么他默认就是扫描启动类所在的 同级包以及同级包下的子包 组件 并注册到容器中#### 3.给大家验证一下我的说法 现在我们将这个三个注解复制出来 然后替换掉外面的@SpringBootApplicaiton
4.创建一个验证能否被扫描的HelloServcie类 加上@Component
5.运行主方法
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
//@SpringBootApplication
public class SpringbootAutoApplication {
public static void main(String[] args) {
//这个方法实际上返回值是Spring容器
ApplicationContext context = SpringApplication.run(SpringbootAutoApplication.class, args);
//从容器中获取到所有的BeanDefinition对象(可以理解为容器中的对象)
String[] beanDefinitionNames = context.getBeanDefinitionNames();
//遍历所有的对象
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
//容器中的对象数量
System.out.println("容器中的对象数量" + beanDefinitionNames.length);
}
//相当于spring配置文件中的<bean id="student" class="com.ysx.pojo.Student">
@Bean
public Student student() {
return new Student();
}
}
6.运行主方法 查看一下控制台信息
7.现在将@ComponentScan注解去掉 再测试一下方法
四、@EnableAutoConfiguration(重点 最核心的部分)
1.这个注解的字面意思就是开启自动配置、也就是我们今天讲的最核心的部分 他的作用就是在启动类启动的时候,扫描类路径,查找 位于META-INF目录中名为spring.factories的所有文件,并对其进行处理,完成自动配置。
2.我们点进@EnableAutoConfiguration查看一下信息 里面有2个核心注解
一个是@AutoConfigurationPackage
这个注解有什么用呢? 我们点进去看一下 发现里面又使用了一个注解@Import 导入了AutoConfigurationPackages.Registrar.class
我们点击Registrar.class进去看一下
可以看到这个方法 传入了两个参数 一个metadata对象和registry 这里我们启动主入口类调试一下
现在可以通过这个注解 来计算出注解所在类的包路径了
有了这个默认路径 那么就能帮助我们的@ComponentScan来完成默认的扫描注册了
别忘了 @EnableAutoConfiguration下面还有一个@Import注解 这个注解才是自动配置的核心 我们直接点进去看一下
点击getAutoConfigurationEntry 可以看到有一个方法getCandidateConfigurations 可以获得所有的候选配置
那么springboot是从什么地方加载到这些配置类的呢 我们继续往下探究
点击getCandidateConfigurations方法 可以看到下面有一个方法 SpringFactoriesLoader.loadFactoryNames 传入了两个参数 我们点击第一个参数 看看传入了是什么东西
参数1 返回了一个EnableAutoConfiguration.class对象 这个对象很关键
回退上一级 来到SpringFactoriesLoader.loadFactoryNames方法 我们点击loadFactoryNames
现在我们就去看一下META-INF/spring.factories文件对应的EnableAutoConfigration它的值到底有哪些