<>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!
* 有了自动配置类,免去我们手动编写配置文件的工作

技术
友情链接
码工具
Toolsou
API参考文档
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信