<>1 pom.xml
* 核心依赖在父工程中
* spring-boot-dependencies
* 我们在引入一些Springboot依赖的时候,不需要版本,就是因为有这些版本仓库
<>1.1在pom.xml中点击 查看父工程
<>1.2这个父工程里面还有一个父工程
<>1.3这个parent里面没有 父工程了
<>1.4管理了大量的jar 包版本
<>1.5在Spring-boot-starter-parent中 配置了资源过滤,不需要我们去配置了。
<>2启动器
<dependencies> <!--启动器--> <dependency> <groupId>org.springframework.boot</
groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
1.启动器:说白了就是SpringBoot的启动场景;
2.比如:Spring-boot-starter-web,他就会帮助我们自动导入web环境所有的依赖!
3.SpringBoot 会将所有的功能场景都变成一个个的启动器
<>3主程序
主程序就两个东西,一个注解和SpringApplication.run()
1.@SpringBootApplication 标注这个类是一个Springboot的应用
2.SpringApplication.run(DemoApplication.class, args); 将SpringBoot
应用启动,通过反射加载DemoApplication类的对象
表面意思
<>3.1注解
点进去它是一个组合注解
这个里面还有很多其他
1.@SpringBootConfiguration
SpringBoot的配置
2.@EnableAutoConfiguration
自动导入配置
3.@ComponentScan
扫描包,去除哪些东西
4.@ConfigurationPropertiesScan
配置扫描
@SpringBootConfiguration
点进去@SpringBootConfiguration
由一个configuration配置的
@Configuration :代表这个是一个Spring 配置类
说明启动类也是一个配置类
点进去@Configuration
发现它只有一个Component 注解,说明这也是Spring一个组件
<>3.2@EnableAutoConfiguration
自动导入配置
点进去
发现除了4个默认配置注解以外,还发现@AutoConfigurationPackage 自动配置包
@AutoConfigurationPackage
点进去@AutoConfigurationPackage 注解`
发现导入选择器
@Import(AutoConfigurationPackages.Registrar.class)
点进AutoConfigurationPackages类
//导入初始化的一些bean static class Registrar implements ImportBeanDefinitionRegistrar,
DeterminableImports { //metadata 元数据 @Override public void
registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry
registry) { //PackageImport 导入元数据 register(registry, new PackageImport(metadata)
.getPackageName()); } @Override public Set<Object> determineImports(
AnnotationMetadata metadata) { return Collections.singleton(new PackageImport(
metadata)); } }
回到@EnableAutoConfiguration 注解
查看另一个注解 @Import(AutoConfigurationImportSelector.class) 自动配置导入选择
@Import(AutoConfigurationImportSelector.class)
点进AutoConfigurationImportSelector 看看
看到AutoConfigurationImportSelector 类中选择组件的方法
public String[] selectImports(AnnotationMetadata annotationMetadata)
选择组件:就是选择哪些我们配置的pom.xml中的东西
点进loadMetadata
来到 AutoConfigurationMetadataLoader类的方法
回到AutoConfigurationImportSelector类
* 继续分析 selectImports 方法
* getCandidateConfigurations 获取所有的配置 List<String> configurations =
getCandidateConfigurations(annotationMetadata, attributes);
* 核心方法
* getCandidateConfigurations 获取候选的配置
* loadFactoryNames 首先通过加载器加载所有的 protected List<String>
getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes
attributes) { List<String> configurations = SpringFactoriesLoader.
loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in
META-INF/spring.factories. If you " + "are using a custom packaging, make sure
that file is correct."); return configurations; }
@SpringBootApplication 注解标注了 @EnableAutoConfiguration
说明一件事
@SpringBootApplication : 标注这个类是一个SpringBoot 的应用:启动类下的所有资源被导入
继续看getCandidateConfigurations 方法
* 这个配置不为空
* META-INF/spring.factories
* 自动配置的核心文件
查看spring.factories文件
spring.factories 文件内容
* Initializers 初始化的
* Application Listeners 监听的
* Auto Configuration Import Listeners 自动选择导入的包
* Auto Configuration Import Filters
* Auto Configure 自动配置
* Failure analyzers
* Template availability providers
查看spring.factories 文件中的WebMvcAutoConfiuration
WebMvcAutoConfiuration类
WebMvcProperties 类
spring.factories 文件从哪来?
&emspl先读了配置文件,才找到配置类
继续看getCandidateConfigurations 方法
点进去
来到springFactoriesLoader类
查看loadSpringFactories方法
loadSpringFactories方法 可以看到springboot 把所有的资源都加载到配置类中
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
点击 FACTORIES_RESOURCE_LOCATION 常量
加载了spring.factories 文件的所有东西
<>4结论:
* SpringBoot所有的自动配置都是在启动的时候扫描并加载;
* 所有的自动配置类都在这里面 spring.factories
* 但是不一定生效,要判断条件是否成立
* 只有导入了对应的start,就有对应的启动器了
* 有了启动器,我们自动装配就会生效,然后就配置成功了!
* Springboot 启动的时候,从类路径下/META-INF/spring.factories 获取指定的值
* 将这些自动配置类导入容器,自动配置就会生效,帮我进行自动配置
* 以前我们需要自动配置的东西,Springboot帮我们做了
* 整合Java2E ,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.5.RELEASE.jar 这个包下
* 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
* 容器中也会存在非常多的xxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件
@Configuration,JavaConfig!
* 有了自动配置类,免去我们手动编写配置文件的工作