一、对于SpringBoot Pom文件的探究
1.父项目
我们在创建SpringBoot项目的时候,在POM文件中我们导入了一个父项目
当我们点击父项目进来后,就会发现里面还依赖了一个父项目dependencies
当我们在点击这个父项目进来后,下面定义了一个properties这个标签里面定义很多依赖的版本
这里面就相当于SpringBoot的版本仲裁中心,有了这个以后我们在导入的大部分依赖是不需要写版本的。
2.导入的依赖
除了上面声明了父项目,在下面我们导入了 spring-boot-starter-web
spring-boot-starter 是springboot的场景启动器
当我们点击spring-boot-starter-web进来后,就会发现里面导入了很多的依赖,这些是web模块正常运行所依赖的组件
Springboot 还抽取出来了很多场景的启动器,当我们需要哪些场景的时候将相应的starter导入进来即可使用。
二、SpringBoot的入口的探究
这个类是我们SpringBoot的主程序类,主入口类。
上面通过@SpringBootApplication 注解来标注,说明这个类是主配置类,SpringBoot就应该运行这个类。
当我们点进去@SpringBootApplication注解后,会发现它是一个组合注解.
包含了两个注解一个是@SpringBootConfiguration 另一个是 @EnableAutoConfiguration
1. @SpringBootConfiguration
@SpringBootConfiguration 这个注解用来表明这是一个SpringBoot的配置类。当我们点击它进去后会发现它本身就是一个@Configuration注解,表明是一个配置类,配置类等同于以前我们写的配置文件。
@Configuration 是Spring的配置类,而@SpringBoot是springBoot的配置类,当我们点进去后也会发现@Configuration本身也是一个容器内的一个组件
2. @EnableAutoConfiguration
这个注解的作用就是开启自动配置功能,以前我们写Spring的时候需要配置很多的东西,现在通过声明这个注解通知SpringBoot,让它帮我们进行自动配置。
当我们点进去的时候,会看到一个@AutoConfigurationPackage的注解,它的意思是自动配置包,再点进去就会看到通过@import注解给容器中导入组件。
再往里走,点击AutoConfigurationPackages.Registrar.class 就会看到下图
在这里面有一个方法叫做registerBeanDefinitions 这个方法用来注册bean的定义信息,参数中的metadata是注解的元信息,通过new PackageImport(metadata).getPackageName()方法得到我们这个注解所标注的类的包名得到。因此@AutoConfigurationPackage将我们主配置类(@SpringBootApplication标注的类)所在的包及下面子包里面所有的组件扫描到Spring容器中。
在 @EnableAutoConfiguration注解中还有一个@Import(AutoConfigurationImportSelector.class),这个也是通过@import注解来导入一些组件,具体导入那些组件还需要点进去看看。
<stron>List<String> configurations返回的这些组件会被加载到容器中,这里就不对方法进行深究了,可以通过debug的方式了解到会给容器中导入非常多的自动配置类,这些自动配置类会导入我们这个场景所需要的所有组件,并配置好这些组件.
有了上述的自动配置类,就免去了我们自己手动去编写配置,注入功能组件等工作。
需要说明的一点是
这里是通过getCandidateConfigurations方法获取的configurations,点进去这个方法你会看到内部是调用了SpringFactoriesLoader.loadFactoryNames的方法。
这个方法需要我们传递进去的是EnableAutoConfiguration.class和ClassLoader,在对loadFactoryNames这个方法在进入分析,你会发现在这里面,它通过一个类加载器加载了一个FACTORIES_RESOURCE_LOCATION的资源
在该类的最上面我们可以看到FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"
,代表着SpringBoot从类路径下的META-INF/Spring.factories中获取EnableAutoConfiguration所指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置。
我们可以在项目的依赖包中找到上述的文件,这里面所对应的就是就是我们在上面获取的configuration的List集合
</stron>