SpringBoot约定大于配置

news/2024/7/24 10:52:05 标签: spring boot, java, 后端

什么是约定大于配置

"约定大于配置"(Convention Over Configuration)是一种理念,旨在通过默认约定和规则来减少开发人员需要做的配置工作。在Spring Boot框架中,这一原则得到了充分应用,帮助开发者更快地构建高效的应用程序

SpringBoot如何实现约定大于配置

@SpringBootApplication

在springboot项目中,我们会使用@SpringBootApplication注解在启动类上,它提供了相当多的便利性,帮助我们完成了当前启动类目录下的组件扫描和自动配置,其源码如下

 可以看到它是一个组合注解,相当于声明了@Configuration、@EnableAutoConfiguration和@ComponentScan,而自动装配实现的秘密就在@EnableAutoConfiguration注解上

@EnableAutoConfiguration

 

 查看@EnableAutoConfiguration源码,发现它注入了一个AutoConfigurationImportSelector类型的bean,继续跟进

AutoConfigurationImportSelector

我们查看一下AutoConfigurationImportSelector类关系图

AutoConfigurationImportSelector是做什么的呢?该类上的javadoc有这么一句话,“DeferredImportSelector to handle auto-configuration”,deferred的意思是推迟的,意为处理自动装配的推迟的ImportSelector

DeferredImportSelector 是 ImportSelector的子类,它在所有@Configuration bean都处理完毕后运行。而AutoConfigurationImportSelector实现了DeferredImportSelector接口,并实现了该接口的selectImports方法

查看selectImports方法发现,内部的getAutoConfigurationEntry方法就返回了要装配的@Configuration类

其中最关键的是getCandidateConfigurations方法,源码如下

这里调用了SpringFactoriesLoader.loadFactoryNames返回所有的自动装配类,这个方法的第一个入参就是EnableAutoConfiguration.class,第二个入参是获取的类加载器

loadSpringFactories

继续跟进源码,查看最底层的loadSpringFactories方法

 可以看到,loadSpringFactories方法通过类加载器获取META-INF/spring.factories资源,我们项目中的类路径下的(当然包括三方jar包)所有META-INF/spring.factories都会被读取,并返回被自动装配的类

META-INF/spring.factories

spring-boot-autoconfigure模块是springboot的自动装配模块

查看该模块下的spring.factories文件

可以看到,该文件下已经帮我们配置了相当多的Configuration类,这也是springboot实现约定大于配置的关键,至此谜团解开 


http://www.niftyadmin.cn/n/5403805.html

相关文章

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水,除却巫山不是云。不知道这句话用在这里合不合适,好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候,翻看到gitee码云上托管的项目,就像是自己的孩子重新又回来了一样…

在您的下一个项目中选择 Golang 和 Node.js 之间的抉择

作为一名软件开发者,我总是在寻找构建应用程序的最快、最高效的工具。在速度和处理复杂任务方面,我认为 Golang 和 Node.js 是顶尖技术。两者在性能方面都享有极高的声誉。但哪一个更快——Golang 还是 Node?我决定深入一些硬核基准测试&…

第二讲:用geth和以太坊交互

一:安装geth brew install ethereum geth github网址: https://github.com/ethereum/go-ethereum 二: 用geth连接以太坊 以太坊有主网络(Ethereum Mainnet),有测试网络(Sepolia、Goerli 等等…

测试linux系统某些文件属性之[]符号

除了test命令之外,我们还可以使用判断符号[]来进行数据的判断,比如:如果要想知道$HOME的结果是否为空,则可以这样做: [rootkibana ~]# [ -z $HOME ] [rootkibana ~]# 当使用[]时,要特别注意,上…

Mac电脑软件开发的优缺点

Mac电脑软件开发的优缺点 在软件开发领域,Mac电脑一直以其独特的优势占有一席之地。然而,就像任何工具或平台一样,Mac电脑在软件开发方面也存在其优点和缺点。本文将探讨在Mac上进行软件开发的利弊,帮助您了解是否应将Mac作为您的…

C#面:是否可以从一个 static 方法内部发出对非 static 方法的调用

不可以; 不能直接从一个静态方法内部调用非静态方法。 这是因为静态方法是属于类的,而非静态方法是属于类的实例的。 静态方法可以在没有创建类的实例的情况下被调用,而非静态方法需要通过类的实例来调用。 如果想要从静态方法内部调用非…

288.【华为OD机试】AI面板识别(排序算法—JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

Day10:基础入门-HTTP数据包Postman构造请求方法请求头修改状态码判断

目录 数据-方法&头部&状态码 案例-文件探针 案例-登录爆破 工具-Postman自构造使用 思维导图 章节知识点: 应用架构:Web/APP/云应用/三方服务/负载均衡等 安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令:文件…