当前位置: 首页 > news >正文

SpringBoot约定大于配置

什么是约定大于配置

"约定大于配置"(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.lryc.cn/news/311797.html

相关文章:

  • DHCP自动获取IP地址实验(华为)
  • 探索Terraform实践:优化基础设施管理
  • MYSQL高级_目录
  • MongoDB获评2023年Gartner®云数据库管理系统“领导者”
  • 基于FastAPI构造一个AI模型部署应用
  • 【Unity】使用ScriptableObject存储数据
  • ChatGPT聊天机器人数据隐私和安全问题
  • MyBatis三个经典问题
  • JavaEE+springboot教学仪器设备管理系统o9b00-springmvc
  • Java项目:37 springboot003图书个性化推荐系统的设计与实现
  • mysql 8 修改账号密码
  • 拜占庭将军问题与区块链
  • 字节跳动热门的前端开源项目
  • uniapp+vue基于Android的图书馆借阅系统qb4y3-nodejs-php-pyton
  • RabbitMQ如何实现延迟消息?
  • Svg Flow Editor 原生svg流程图编辑器(一)
  • 头像剪切上传
  • 24计算机考研调剂 | 北京信息科技大学
  • 06 - 镜像管理
  • 最简单 导航栏 html css
  • PostgreSQL的学习心得和知识总结(一百三十一)|深入理解PostgreSQL数据库如何使用psql中的变量
  • 支付宝小程序模板开发,实现代小程序备案申请
  • 怎么培养孩子的学习习惯?
  • deeplearning with pytorch (三)
  • LLaMA模型的发布与创新潮流
  • Python之Web开发初学者教程—ubuntu中安装配置redis
  • 如何在Vue中进行单元测试?
  • 开源组件安全风险及应对
  • nginx出现 “414 request-uri too large”
  • 堆和二叉树的动态实现(C语言实现)