回答
“约定大于配置”是 Spring Boot 的核心理念之一,目的是简化开发过程,减少我们在配置上的繁琐工作。具体来说,就是 Spring Boot 通过一系列的默认设置和约定,减少了我们需要显式配置的内容,从而让我们专注于业务逻辑,而不必过多关注框架的配置细节。
它主要从以下几个方面体现:
- 默认配置:Spring Boot 提供了大量的默认配置,一些常见的框架,如 MySQL、redis、JPA 等等,我们可以在不做任何额外配置的情况下就可以自动工作。
- 自动化配置:Spring Boot 可以通过
@EnableAutoConfiguration
注解和大量的自动配置类(@Configuration
)来自动根据项目的类路径和环境来选择合适的配置。例如,当 Spring Boot 检测到我们使用了 H2 数据库,它会自动配置一个内存数据库的连接。 - 外部化配置:通过
application.properties
或application.yml
文件,我们可以非常灵活地修改应用的行为,Spring Boot 会根据这些配置文件来覆盖默认设置,但大多数情况下,默认配置就已经足够满足开发需求。
其实一句话就可以解释:约定大于配置就是减少配置!!!
详解
约定大于配置解释
维基百科解释如下:
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做出决定的数量,活得简单的好处,而又不失灵活性。
本质上是说,开发人员仅需要规定应用中不符约定的部分,例如,如果模型中有个名为 Sale 的类,那么数据库中对应的表就会默认命名为 sales。只有偏离这一约定时,例如将该表命名为“products_sold”,才需写有关这个名字的配置。
如果您所用工具的约定与你的期望相符,便可省去配置;反之,你可以配置来达到你所期待的方式。
设计不好的框架通常需要多个配置文件,每一个都有许多设置。这些配置文件为每一个项目提供像是URL,或是将类映射到数据库表的各种信息。大量包含太多参数的配置文件通常是过度复杂的应用设计(代码坏味道)。 例如,在知名的Java对象关系映射框架Hibernate的早期版本中,将类及其属性映射到数据库上需要是在XML文件中的描述,其中大部分信息都应能够按照约定得到,如将类映射到同名的数据库表,将属性分别映射到表上的字段。后续的版本抛弃了XML配置文件,而是使用这些恰当的约定,对于不符合这些约定的情形,可以使用Java 标注来说明。
大明哥理解:
“约定大于配置”是指框架在大多数情况下提供了符合常规应用需求的默认设置,我们只需要遵循这些约定,而不必为每个细节都编写配置。这就让我们不必关注每个小配置项的选择,减少了出错的概率,同时也提高了开发效率。Spring Boot 倡导的这种约定和默认配置方式,极大地降低了配置的复杂度。
Spring Boot 中的约定大于配置
默认配置
Spring Boot 为常用的框架都提供了大量的默认配置。
Spring Boot 在启动时会自动根据当前环境和类路径中的依赖来决定合适的默认配置。例如,Spring Boot 会根据类路径中是否存在某个组件来决定是否启用相关的自动配置。当我们使用 Spring Boot 开发一个 Web 应用时,Spring Boot 会自动配置嵌入式的 Tomcat 服务器、Spring MVC、默认的视图解析器等,而不需要我们手动配置这些内容。Spring Boot 中的 spring-boot-starter-web
依赖就包含了 Web 开发所需的全部配置。
自动配置机制
Spring Boot 通过 @EnableAutoConfiguration
来实现自动配置,这个注解会引导 Spring Boot 扫描类路径下的条件并启用对应的自动配置。
Spring Boot 中的自动配置机制可以根据项目中包含的依赖和当前的环境来决定是否引入某个组件,所以,如果我们使用了特定的数据库、缓存、消息队列或者 Web 框架时,Spring Boot 会自动配置合适的组件。例如,我们在 pom.xml
添加了 Spring Data JPA
依赖,Spring Boot 会自动为我们配置 JPA 的 EntityManagerFactory、数据源、事务管理等。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
外部化配置
尽管 Spring Boot 提供了许多默认配置,但是我们仍然可以通过配置文件,如 application.properties
或 application.yml
来覆盖这些默认值。外部化配置的优点在于,不同的环境可以有不同的配置,我们不必在代码中硬编码配置。
Spring Boot 的默认约定
Spring Boot 提供了很多默认的约定来简化配置。比如 Spring Boot 约定项目结构如下:
/src/main/java:目录用来存放 java 源文件
/src/main/resources:目录用来存放资源文件,如 application.yml 文件,MyBatis的*mapper.xml文件
/src/test/java:目录用来存放 java 测试文件
/src/test/resources:目录用来存放测试资源文件
/target:目录为项目的输出位置
再比如,Spring Boot 提供了大量的 starter 依赖,我们只需要引入对应的 starter,就能自动配置好相关的组件。如使用 spring-boot-starter-web
作为 Web 应用的依赖,Spring Boot 会自动为我们配置好 Spring MVC、嵌入式 Tomcat 等基础设施,避免了繁琐的手动配置。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。