SpringBoot 自动配置原理

使用SpringBoot之后,一个整合了SpringMVC的WEB工程开发变得无比简单,那些繁杂的配置都消失不见了,这是如何做到的?

一切都是从main函数来的,所以来看看启动类:

在这里插入图片描述

  • 注解:@SpringBootApplication
  • run方法:SpringApplication.run();

了解@SpringBootApplication

查看源码:

在这里插入图片描述

这里的三个重点注解:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootConfiguration

继续查看源码:
在这里插入图片描述
在这个注解上面,又有一个@Configuration注解,通过上面的注释阅读知:这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration的类,并且读取其中的配置信息。而@SpringBootConfiguration是来声明当前类时SpringBoot应用的配置类,项目中只能有一个,所以一般无需自己添加

@EnableAutoConfiguration

关于这个注解,官网上有一段说明:

The second class-level annotation is @EnableAutoConfiguration. This annotation
tells Spring Boot to “guess” how you want to configure Spring, based on the jar
dependencies that you have added. Since spring-boot-starter-web added Tomcat
and Spring MVC, the auto-configuration assumes that you are developing a web
application and sets up Spring accordingly.

简单翻译以下:

第二级的注解@EnableAutoConfiguration,告诉SpringBoot基于你所添加的依赖,去“猜测”你想要如何配置Spring。比如我们引入了spring-boot-starter-web,而这个启动器中帮我们添加了tomcatSpringMVC的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!

总结

SpringBoot内部对大量的第三方库或者Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有默认配置就会生效。

所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配制就可以交给SpringBoot处理了。除非你不希望使用SpringBoot的默认配置,它也提供了自定义配置的入口。

@ComponentScan

跟进源码:

在这里插入图片描述

在这里插入图片描述

配置组件扫描的指令,提供了类似于<context:component-scan>标签的作用:通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从这个注解的类所在的包开始,扫描包及子包。

因此扫描的包是该类所在包及其子包,因此,一般启动类会放在一个比较前的包目录。

默认配置原理

默认配置类

我们已经知道@EnableAutoConfiguration会开启SpringBoot的自动配置,并且根据你引入的依赖生效对应的默认配置。那么问题来了:

  • 这些默认配置是在哪里定义的?
  • 为何以来引入就会触发配置?

其实在我们的项目中已经引入了一个依赖:spring-boot-autoconfigure,其中定了大量自动配置类:

在这里插入图片描述

来看看我们比较熟悉的springmvc的自动配置类

在这里插入图片描述

在这里插入图片描述

关于上面的四个注解:

  • @Configuration:声明这个类是一个配置类;
  • @ConditionalOnWebApplication(type = Type.SERVLET):在某个条件下,此处就是满足项目类是 Type.SERVLET类型,也就是一个普通Web工程。
    在这里插入图片描述
  • @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })

这里的条件是OnClass,也就是满足以下类存在: Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class,其中Servlet只要引入了tomcat依赖自然会有,后两个需要引入SpringMVC才会有,这里就判断你是否引入了相关依赖,引入依赖后该条件成立,当前类的配置才会生效。

  • @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

OnMissingBean是说环境中没有指定的Bean这个才生效,意思就是自定义配置的入口,也就是说如果我们自己配置了一个WebMVCConfigurationSupport的类,那么这个默认配置就会失效。

看看该类中定义的视图解析器:

在这里插入图片描述

默认配置属性

查看这些默认属性是从哪来的,找到了WebMvc自动配置的处理器,这个类上面的@EnableConfigurationProperties不就是我们注入属性时使用的注解吗?
在这里插入图片描述

找到内部资源视图解析器的prefix和suffix属性。
在这里插入图片描述

ResourceProperties中主要定义了静态资源:
在这里插入图片描述
如果我们要覆盖这些默认属性,只需要在application.properties中定义与其前缀名prefix和字段名一致的属性即可。

总结

SpringBoot提供默认配置,默认配置生效的条件:

  • 引入了该配置的相关依赖,根据你引入的依赖来判断你想配置哪些东西;

  • 你自己没有配置,否则会覆盖默认配置;

  • 启动器

如果不想配置,只需引入依赖即可,而依赖版本也不用担心,因为只要引入了SpringBoot提供的starter启动器,就会自动管理依赖版本了。

SpringBoot启动器:链接:https://pan.baidu.com/s/1jQQEk6wwyzSilgpG5CoiEg 提取码:t3g5

  • 全局配置

SpringBoot的默认配置都会读取默认属性,而这些属性可以通过自定义的application.properties文件来进行覆盖,这样虽然使用的还是默认配置,但是配置中的指定的值已经被我们定义的值覆盖。

全局配置:链接:https://pan.baidu.com/s/1-WBccDq5OQsb8cRES0l-0Q
提取码:ovuq

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值