2018-8-10springboot尚硅谷视频学习之HelloWorld入门细节自动配置
@SpringBootApplication
SpringBoot应用 当SpringBootApplication标注在某个类上表示这个类是Springboot的主配置类,SpringBoot
就会通过运行这个类的主(main)方法来启动SpringBoot应用;
具体实现如下1
2
3
4
5
6
7
8
9
10 (ElementType.TYPE)
(RetentionPolicy.RUNTIME)
(excludeFilters = {
(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public SpringBootApplication {
@SpringBootConfiguration
SpringBoot配置类 标注在某个类上的时候表示这是一个SpringBoot的配置类;
具体实现如下1
2
3
4
5
6 ({ElementType.TYPE})
(RetentionPolicy.RUNTIME)
public SpringBootConfiguration {
}
@Configuration
配置类上来标注这个注解 可以理解为配置文件;
具体实现如下1
2
3
4
5 (ElementType.TYPE)
(RetentionPolicy.RUNTIME)
public Configuration {
@Component
配置类也是容器的一个组件;
@EnableAutoConfiguration
开启自动配置功能,SpringBoot帮我们自动配置了所需要的包之类的依赖;
具体实现如下1
2
3
(AutoConfigurationImportSelector.class)
public EnableAutoConfiguration {
@AutoConfigurationPackage
@AutoConfigurationPackage 自动配置包
具体实现如下1
(AutoConfigurationPackages.Registrar.class)
可以看到是由底层的Spring注解@import而来,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class 类来指定
==可以看出其作用就是将主配置类所在的包以及下面所有子包里面的所有组件扫描到Spring容器中 #001180==
给容器导入组件
AutoConfigurationImportSelector; 自动导入组件选择器
public interface ImportSelector {
/*** Select and return the names of which class(es) should be imported based on * the {@link AnnotationMetadata} of the importing @{@link Configuration} class. */
String[] selectImports(AnnotationMetadata importingClassMetadata);
将所有需要导入的组件以全类名的方式返回;这些组件就会添加到容器中
下断点debug后可以看到
通过接口的形式最终会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
通过 SpringFactoriesLoader.loadFactoryNames 方法返回EnableAutoConfiguration.class和classLoader
可以看到我们通过获取类加载器(classload)获取资源后将它作为properties的文件形式传出来
而文件资源获取的位置可以看到 FACTORIES_RESOURCE_LOCATION;
从而拿出了工厂名(factoryClassName)
SpringBoot在启动的时候从类路径的 META-INF/spring.factories 中获取 EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,也就是实现了自动配置
J2ee的整体方案和自动配置都在 springframework\boot\spring-boot-autoconfigure-*.jar这个jar包下;