什么是“约定大于配置”?
“约定大于配置”是一种简化开发的设计理念。简单来说,就是框架默认提供了常见的配置和行为,开发者只需要按照约定来编写代码,避免了繁琐的配置,只在需要时进行定制和调整。这种理念在Spring Boot中被充分体现,开发者可以专注于业务逻辑的开发,而不必在配置文件中花费大量精力
在Spring Boot中,这一理念通过自动配置(Auto Configuration)和默认约定得到了广泛应用,极大地简化了应用的搭建过程
Spring Boot 如何实现“约定大于配置”
-
自动配置
Spring Boot 的核心特性之一就是自动配置(Auto Configuration)。通过自动配置,Spring Boot会自动猜测和配置你所需要的组件。例如,假如你在类路径下包含了H2数据库的依赖,Spring Boot会自动配置一个内存中的H2数据库连接,不需要开发者手动配置数据源。如果没有找到合适的配置,Spring Boot也会给出默认的配置行为 -
内嵌服务器
Spring Boot 默认使用内嵌的Web服务器(如Tomcat、Jetty或Undertow)。这意味着开发者无需再手动配置Web服务器相关的bean,也不需要将其作为独立的应用部署在外部服务器上。你只需要创建一个SpringApplication.run(Application.class, args)
,Spring Boot会自动完成启动、配置和运行的所有过程 -
默认约定的目录结构
Spring Boot 提供了默认的目录结构,如:src/main/java
用于存放Java源代码src/main/resources
用于存放配置文件src/test
用于存放测试代码
Spring Boot会默认按照这些目录结构来扫描和加载相关的文件,开发者不必做额外配置。
-
默认配置
Spring Boot的许多功能都有合理的默认配置。比如,Spring Boot自动根据你的应用依赖来配置常见的Bean和设置,如JPA、Web、Security等。如果你不做任何修改,它会自动启动并运行在默认配置下。这些默认值都能满足大多数开发场景,只有在业务上有特殊要求时才需要进行定制 -
Spring Boot Starter
Spring Boot 提供了大量的 "Starter" 依赖(如spring-boot-starter-web, spring-boot-starter-data-jpa等),这些 Starter 包含了一些典型的配置和常见的第三方库,使得开发者不必关心各种库的配置细节,只需要引入对应的 Starter 依赖即可。这种约定极大地降低了配置的复杂度
约定大于配置的优势
-
减少配置量
Spring Boot 的“约定大于配置”原则大大减少了开发时需要书写和管理的配置文件。你不必每次都进行复杂的配置,只需根据实际需要修改个别参数即可 -
提高开发效率
Spring Boot 提供了丰富的默认行为,使得开发者可以在短时间内搭建和启动应用,尤其是对于大多数常见的应用场景,Spring Boot 可以通过默认配置直接满足需求。开发者可以将更多的精力放在业务逻辑和功能实现上,而非基础设施的配置 -
降低错误率
通过约定,开发者减少了自定义配置的复杂度,减少了配置错误的风险。例如,Spring Boot 的自动配置可以自动绑定数据库连接信息,避免了手动配置时可能产生的错误 -
更易于上手
对于初学者来说,Spring Boot 提供的默认配置和自动配置可以让他们快速入门,不必理解框架内部的复杂配置和参数。即使是没有深入了解Spring框架的人,也能够通过遵循Spring Boot的约定来开发应用 -
可扩展性
在Spring Boot中,开发者可以根据需要轻松覆盖默认配置。如果某些默认行为不符合需求,可以通过自定义配置来调整或替代。比如,数据库的配置、Web服务器的配置等,都可以通过配置文件或代码来覆盖
约定大于配置的潜在问题
虽然“约定大于配置”原则带来了许多好处,但在一些情况下,也可能带来潜在的问题:
-
过度简化
Spring Boot 提供的自动配置虽然简化了很多开发流程,但有时也会隐藏一些细节,可能导致开发者对框架的运行原理了解不够深入,出现依赖于默认配置的情况。这对于一些复杂的应用场景可能不够灵活,需要开发者深入学习和调整 -
无法满足特殊需求
如果应用的需求比较特殊或与框架的默认配置不兼容,开发者可能需要手动配置和覆盖大量的默认行为。过多的自定义配置可能使得项目变得难以维护和管理 -
依赖于约定
如果开发者在项目中没有遵循Spring Boot的约定,就会失去框架的自动配置优势。比如,如果你没有按照Spring Boot默认的包结构来组织代码,框架可能无法自动扫描你的bean
如何调整Spring Boot的默认行为?
尽管Spring Boot遵循“约定大于配置”的原则,但在某些场景下,我们仍然可以根据需求进行调整:
-
修改
application.properties
或application.yml
文件
Spring Boot允许开发者通过配置文件来覆盖默认配置。例如,修改数据库连接、日志级别、端口号等配置项。你只需在配置文件中声明新的值,框架会自动读取并生效 -
使用自定义的自动配置
开发者可以创建自定义的自动配置类来覆盖或扩展默认的自动配置行为。通过使用@EnableAutoConfiguration
和@Configuration
注解,开发者可以自己定义一些自动配置逻辑,灵活定制应用的行为 -
显式配置
如果开发者不希望使用自动配置功能,可以通过@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
排除某些自动配置,或者直接使用显式配置