SpringBoot之初步了解自动配置原理

1. 父依赖

pom.xml

  • spring-boot-dependencies:核心依赖在父工程中
  • 我们引入SpringBoot依赖的时候不需要指定版本,就因为有这些版本仓库
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2. 启动器

<!--启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
  • 启动器:说白了就是Springboot的启动场景;
  • 比如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖!.
  • springboot会将所有的功能场景,都变成一个个的启动器
  • 我们要使用什么功能,就只需要找到对应的启动器就可以了starter

了解其他的启动器:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter(如图所示)
在这里插入图片描述

3. 主程序

@SpringBootApplication
public class HelloworldApplication {
	public static void main(String[] args) {
		SpringApplication.run(HelloworldApplication.class, args);
	}
}
  • @SpringBootApplication:是一个组合注解,使用该注解表示一个SpringBoot应用项目
    在这里插入图片描述
    发现里面有两个核心注解
  • @SpringBootConfiguration:表示为SpringBoot配置
  • @EnableAutoConfiguration:表示为是否为自动配置

之前学习spring见到的注解

  • @ComponentScan:表示为自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中
    在这里插入图片描述

3.1 @SpringBootConfiguration

点击@SpringBootConfiguration

  • @Configuration:表示为spring配置类
    在这里插入图片描述
    再点击@Configuration
  • @Component:表示为spring组件
    在这里插入图片描述

3.2 @EnableAutoConfiguration:表示为是否为自动配置

点击@EnableAutoConfiguration

  • @AutoConfigurationPackage:自动配置包
    在这里插入图片描述
    再点击@AutoConfigurationPackage
  • Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 ;
    在这里插入图片描述
    在这里插入图片描述
    返回上两层,我们点击AutoConfigurationImportSelector看看
    AutoConfigurationImportSelector :自动配置导入选择器
    我们进入这个类后一直慢慢的阅读,因为这个注解是有关配置的问题,所以我们找有关配置相关的,当我们阅读到一个方法时,我们通过函数名getCandidateConfigurations可以大概的知道是获取候选配置,终于发现是有关配置的了,我们再点击getCandidateConfigurations方法看看。
    在这里插入图片描述
    这个方法又调用了 SpringFactoriesLoader 类的静态方法!我们进入SpringFactoriesLoader类loadFactoryNames() 方法
    在这里插入图片描述
    getSpringFactoriesLoaderFactoryClass标注了EnableAutoConfiguration注解
    在这里插入图片描述

点击loadSpringFactories 方法
在这里插入图片描述
点击loadFactoryNames方法,发现该方法是读取spring.factories配置文件
在这里插入图片描述

3.3 spring.factories

META-INF/spring.factories:自动核心配置文件
在这里插入图片描述
在这里插入图片描述

3.4 以HttpEncodingAutoConfiguration案例讲解自动配置原理

我们找常见的HttpEncodingAutoConfiguration类为案例来讲解自动配置原理

  1. 首先我们点击HttpEncodingAutoConfiguration类
    在这里插入图片描述
    HttpEncodingAutoConfiguration.java
@Configuration(proxyBeanMethods = false)// 表示为配置类
@EnableConfigurationProperties(ServerProperties.class)//表示自动配置属性:ServerProperties
//Spring的底层注解(@ConditionalOnXXX):根据不同的条件,来判断当前配置或者类是否生效!
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)//表示不是web应用就不生效
@ConditionalOnClass(CharacterEncodingFilter.class)//表示不是CharacterEncodingFilter类就不生效
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)//表示是否有server.servlet.encoding配置,没有则走默认配置
public class HttpEncodingAutoConfiguration {

	private final Encoding properties;

	public HttpEncodingAutoConfiguration(ServerProperties properties) {
		this.properties = properties.getServlet().getEncoding();
	}

	@Bean
	@ConditionalOnMissingBean
	public CharacterEncodingFilter characterEncodingFilter() {
		CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
		filter.setEncoding(this.properties.getCharset().name());
		filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
		filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
		return filter;
	}

	@Bean
	public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
		return new LocaleCharsetMappingsCustomizer(this.properties);
	}

	static class LocaleCharsetMappingsCustomizer
			implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {

		private final Encoding properties;

		LocaleCharsetMappingsCustomizer(Encoding properties) {
			this.properties = properties;
		}

		@Override
		public void customize(ConfigurableServletWebServerFactory factory) {
			if (this.properties.getMapping() != null) {
				factory.setLocaleCharsetMappings(this.properties.getMapping());
			}
		}

		@Override
		public int getOrder() {
			return 0;
		}

	}

}

说明:

  • @Configuration(proxyBeanMethods = false):表示为配置类
  • @EnableConfigurationProperties(ServerProperties.class):表示自动配置属性:ServerProperties
  • Spring的底层注解(@ConditionalOnXXX):根据不同的条件,来判断当前配置或者类是否生效!
  • @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET):表示不是web应用就不生效
  • ConditionalOnClass(CharacterEncodingFilter.class):表示不是CharacterEncodingFilter类就不生效
  • @ConditionalOnProperty(prefix = “server.servlet.encoding”, value = “enabled”, matchIfMissing = true):表示是否有server.servlet.encoding配置,没有则走默认配置
  1. 我们点击ServerProperties类查看
    在这里插入图片描述
    精髓:

  2. SpringBoot启动会加载大量的自动配置类

  3. 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

  4. 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

  5. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

  • xxxxAutoConfigurartion:自动配置类;给容器中添加组件

  • xxxxProperties:封装配置文件中相关属性;

3.5 查看生效配置类

在yaml中配置

debug: true 	

在这里插入图片描述
在这里插入图片描述

3.6 问题

3.6.1 为什么自动配置没有生效,怎么解决?

  • 需要导入对应的start才能有作用!
  • 因为存在核心注解@ConditionalOnxxx
    在这里插入图片描述
    总结:
  • SpringBoot所有自动配置都是在启动的时候扫描并加载: spring.factories(所有自动配置类都在里面,但不一定生效)
  • SpringBoot自动会加载大量自动配置类-------------->自动配置类在spring-boot-autoconfigure-2.45.RELEASEjar包下——从类路经下/META-INF/spring.factories获取指定值
  • 我们需要的功能有没有在SpringBoot默认的自动配置类中——如果没有需要在application.yaml中配置
  • 给容器中自动配置类添加组件时,会从properties类中获取属性
  • 把所有需要导入的组件,以类名方式返回,这些组件被添加到容器
  • 容器中(spring.factories)存在很多xxxAutoConfiguration的文件(@Configuration和@Bean)
    • 自动配置类,给容器中添加组件
    • yaml可以注入到我们的配置类中

3.7 run方法

在这里插入图片描述
查看构造器:
在这里插入图片描述
内容参考:https://www.bilibili.com/video/BV1PE411i7CV
仅用于学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值