SpringBoot自动配置特性

文章详细阐述了SpringBoot在引入特定依赖后进行的自动配置,包括Tomcat、SpringMVC和Web功能的设置。SpringBoot基于启动类位置自动扫描包路径,并提供了默认配置。用户可以通过配置文件修改默认值,且加载的自动配置组件是按需的。此外,文章解释了@SpringBootApplication注解的工作原理,以及如何通过debug模式查看自动配置报告。

当我们引入了 SpringBoot 父级依赖和 spring-boot-starter-web 依赖后;SpringBoot 会帮我们实现如下自动配置

一、自动配置

  1. 自动配置 Tomcat

当我们引入了 spring-boot-starter-web 依赖后,在 spring-boot-starter-web-2.3.4.RELEASE.pom 配置中可以看到自动引入了 tomcat 依赖

  • 引入 Tomcat 依赖
  • 配置 Tomcat
    在这里插入图片描述
  1. 自动配置 SpringMVC
  • 引入 SpringMVC 依赖
  • 配置 SpringMVC
  1. 自动配置 Web 常用功能;例如:字符编码
    我们可以在 SpringBoot 项目的启动类中验证一下,在 SpringbootStudyApplication.class 中添加如下代码验证
    在这里插入图片描述
    从打印出的这些 Bean 名称可以看到,SpringBoot 已经配置好了 Web 开发中可能会遇到的常见场景;例如:characterEncodingFilter - 解决传输过程中中文乱码问题;multipartResolver - 文件上传配置;
  2. 自动配置默认包结构
    在 SpringBoot 项目中,我们并没有配置 @ComponentScan 注解 Spring 扫描包路径;SpringBoot 会以启动类所在的包作为默认包路径;所以如果启动类的位置变化可能会导致 Spring 初始化扫描包路径不正确;官方文档有如下介绍
    在这里插入图片描述
    但如果启动类的位置无法成为默认包路径的话,我们可以通过如下方式手动指定包路径
  • @SpringBootApplication(scanBasePackages = “com.study.springboot”)
  • @ComponentScan(basePackages = “com.study.springboot”);该注解应该添加到添加了@Configuration 配置的类上
  1. 各种配置的默认值
    在 SpringBoot 项目中,默认配置最终都是映射到某个类上;配置文件中可以修改对应的默认配置,因为配置文件中的值会绑定到对应的类上,这些类会在容器中创建对象实现配置修改;例如:修改 Tomcat 默认启动端口为 8888

在这里插入图片描述
6. 按需加载自动配置项
在 SpringBoot 项目中,引入了哪些场景,这些场景的自动配置才会开启;SpringBoot 对所有 starter 的自动配置都依赖于 spring-boot-starter-web 依赖 --> spring-boot-starter 依赖 --> spring-boot-autoconfigure 依赖;这也是为什么我们自定义 starter 的时候,必须要引入 spring-boot-starter 依赖 的原因
在这里插入图片描述
虽然 SpringBoot 启动的时候,会默认自动注册 127 个组件,但最终是按需配置注册;例如:我们的项目中并没有引入 AOP 相关的依赖,所以在 spring-boot-autoconfigure-2.3.4.RELEASE.jar 下的 org.springframework.boot.autoconfigure.aop.AopAutoConfiguration.class 找那个可以看到如下代码
在这里插入图片描述
从上面 @ConditionalOnProperty,@ConditionalOnClass 这些注解可以看出因为我们没有引入 AOP 相关的依赖和配置,这些组件自然不会被注册

二、自动配置原理

查看 @SpringBootApplication 注解,发现该注解上配置了如下注解,已经包含了 @ComponentScan 注解
在这里插入图片描述
2. @SpringBootConfiguration 注解点进入后发现该注解上添加了一个 @Configuration 注解,代表启动类也是一个配置类
3. @EnableAutoConfiguration 注解点进去后发现该注解上有两个注解

3.1 @AutoConfigurationPackage:点进去后发现里面通过 @Import 注解导入了自动配置包@Import(AutoConfigurationPackages.Registrar.class);通过 Registrar 类给容器导入一系列组件,将启动类所在包路径下的所有组件注册到容器;其实现如下
在这里插入图片描述
3.2 @Import(AutoConfigurationImportSelector.class);通过 AutoConfigurationImportSelector.getAutoConfigurationEntry() 方法给容器批量导入组件;一共 127 个组件;其实现如下
在这里插入图片描述
3.3 这些组件是怎么来的呢?从这个方法调用步骤一直查看下去 getAutoConfigurationEntry() --> getCandidateConfigurations() --> SpringFactoriesLoader.loadFactoryNames() --> loadSpringFactories(classLoader);在 loadSpringFactories() 这个方法下有如下代码
在这里插入图片描述
FACTORIES_RESOURCE_LOCATION 这个常量的值为:META-INF/spring.factories;这说明 AutoConfigurationImportSelector.class 这个类主要作用是扫描所有组件下的 META-INF/spring.factories 文件中指定的组件并进行注册;而那 127 个组件就在 spring-boot-autoconfigure-2.3.4.RELEASE.jar 下的 spring.factories 中(从 21 行到 148 行)
在这里插入图片描述
4. @ComponentScan 注解指定了以启动类所在包路径为默认扫描路径

  1. 在开发过程中,如何查看 SpringBoot 项目自动配置了哪些组件(Positive matches),哪些组件没有配置(Negative matches),哪些依赖没有被引入(Exclusions)等等信息呢?只需要在项目的配置文件(application.properties)中添加 debug = true(默认 false) 配置即可;在启动项目的时候,就会打印出自动配置报告信息
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值