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

Spring Boot 中 “约定优于配置” 原则的理解

一、概念简述

“约定优于配置”(Convention over Configuration,简称 CoC)是一种软件设计理念,在 Spring Boot 框架中得到了充分体现。该理念倡导开发人员遵循一套预先定义好的约定,从而减少针对通用功能的显式配置。这样,开发人员能够将更多精力聚焦于业务逻辑的实现,而非花费大量时间在繁琐的配置文件编写上。

二、在 Spring Boot 中的具体体现

1. 项目结构约定

Spring Boot 推荐采用特定的项目结构,例如典型的 Maven 或 Gradle 项目结构:

收起

plaintext

src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── example/
│   │           └── myproject/
│   │               ├── MyProjectApplication.java
│   │               ├── controller/
│   │               ├── service/
│   │               └── repository/
│   └── resources/
│       ├── application.properties
│       └── static/
│           └── css/
│               └── styles.css
│       └── templates/
│           └── index.html
└── test/
    └── java/
        └── com/
            └── example/
                └── myproject/
                    └── MyProjectApplicationTests.java

在这种结构下,src/main/java 存放 Java 源代码,src/main/resources 存放配置文件、静态资源和模板文件等。MyProjectApplication.java 作为 Spring Boot 应用的主启动类,位于根包下。这种约定使得项目结构清晰,开发人员能够快速定位和管理不同类型的文件。

2. 自动配置机制

Spring Boot 的自动配置是 “约定优于配置” 的核心体现。通过大量的条件化配置类(@Conditional 注解实现),Spring Boot 能够根据项目的依赖情况自动配置许多常见的组件。例如,如果项目依赖了 spring-boot-starter-web,Spring Boot 会自动配置好 Web 开发所需的 Servlet 容器(如 Tomcat)、Spring MVC 等相关组件,无需开发人员手动编写大量的 XML 配置或 Java 配置类来进行初始化。

收起

java

@Configuration
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    // 配置相关代码
}

上述代码展示了 WebMvcAutoConfiguration 类,它通过 @ConditionalOnClass 等注解判断相关类是否存在于类路径中,从而决定是否自动配置 Spring MVC 相关功能。

3. 配置文件约定

Spring Boot 使用 application.properties 或 application.yml 作为默认的配置文件。在这些文件中,开发人员可以对应用的各种属性进行配置,而且配置属性遵循一定的命名约定。例如,配置数据源时,使用 spring.datasource.urlspring.datasource.username 和 spring.datasource.password 等属性。这种统一的命名约定使得配置清晰易懂,并且与 Spring Boot 的自动配置机制紧密结合。

收起

properties

# application.properties 示例
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

yaml

# application.yml 示例
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

4. 依赖管理约定

Spring Boot 提供了一系列的 Starter POMs,这些 Starter 定义了项目所需的一组相关依赖。开发人员只需引入相应的 Starter,Spring Boot 就能确保这些依赖的版本兼容性。例如,spring-boot-starter-data-jpa Starter 包含了使用 Spring Data JPA 进行数据库操作所需的依赖,如 Hibernate、JDBC 驱动等,并且会自动管理这些依赖的版本。

收起

xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

在 Gradle 中:

收起

groovy

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

三、优势

  1. 提高开发效率:减少了开发人员编写配置文件的工作量,使得开发人员能够更快地搭建项目并开始实现业务逻辑。例如,在开发一个简单的 Spring Boot Web 应用时,只需引入 spring-boot-starter-web 依赖,即可快速拥有一个可用的 Web 服务,无需手动配置 Servlet 容器、Spring MVC 等复杂组件。
  2. 项目结构清晰:统一的项目结构约定使得代码的组织和维护更加容易。不同开发人员接手项目时,能够迅速熟悉项目的架构和文件布局,降低了学习成本。
  3. 减少配置错误:由于遵循约定,配置的一致性得到保障,减少了因配置不当导致的错误。例如,在配置数据源时,按照 Spring Boot 的约定命名属性,避免了因属性名拼写错误而引发的连接失败等问题。
  4. 便于团队协作:团队成员遵循相同的约定进行开发,使得代码风格和项目结构保持一致,有利于代码的审查和维护,提高了团队协作的效率。

四、局限性

  1. 灵活性受限:对于一些特殊的业务需求或与约定不符的场景,可能需要花费额外的精力来打破约定进行定制化配置。例如,当项目需要使用非标准的项目结构或自定义的配置属性命名方式时,可能需要更多的配置和代码调整。
  2. 学习成本:虽然 Spring Boot 的约定本身并不复杂,但对于初学者来说,理解和掌握这些约定仍需要一定的时间。特别是在面对自动配置机制时,可能需要深入了解其原理才能更好地进行调试和定制化开发。
  3. 版本兼容性:尽管 Spring Boot 通过 Starter 管理依赖版本,但在引入一些第三方库时,可能会出现与 Spring Boot 自动配置的版本不兼容问题。这需要开发人员对依赖管理有更深入的了解,以解决潜在的版本冲突。

综上所述,Spring Boot 的 “约定优于配置” 原则极大地简化了 Spring 应用的开发过程,提高了开发效率和项目的可维护性。尽管存在一些局限性,但在大多数情况下,它为开发人员提供了一种高效、便捷的开发方式,尤其适用于快速迭代的项目开发场景。

相关文章:

  • 每日温度问题:如何高效解决?
  • Java轻量级代码工程
  • C#(Winform)通过添加AForge添加并使用系统摄像机
  • Git学习使用笔记
  • JENKINS(全面)
  • 使用API有效率地管理Dynadot域名,清除某一文件夹中域名的默认DNS设置
  • 如何实现华为云+deepseek?
  • webshell通信流量分析
  • 玄机——第一章 应急响应-webshell排查
  • Android笔记【snippet】
  • Selenium WebDriver自动化测试(扩展篇)--Jenkins持续集成
  • 物联网智能语音控制灯光系统设计与实现
  • Feign接口调用-请求响应数据底层实现
  • 深挖vue3基本原理之六 —— 类型系统设计与运行时核心架构
  • 【MyBatis】_使用XML实现MyBatis
  • 【transformers.Trainer填坑】在自定义compute_metrics时logits和labels数据维度不一致问题
  • 通过沙箱技术测试识别潜在的威胁
  • 第一章:认识Tailwind CSS - 第三节 - Tailwind CSS 开发环境搭建和工具链配置
  • redis的哨兵模式和集群模式
  • 1.3 AI大模型应用浪潮解析:高校、硅谷与地缘政治的三角博弈
  • 高进华“控股”后首份年报出炉,史丹利账上可动资金大幅缩水
  • 短剧剧组在贵州拍戏突遇极端天气,演员背部、手臂被冰雹砸伤
  • 长三角铁路五一假期发送旅客超2000万人次,同比增幅超一成
  • 马斯克的胜利?OpenAI迫于压力放弃营利性转型计划
  • 贵州黔西市游船倾覆事故最后一名失联人员被找到,但已无生命体征
  • 印度扩大对巴措施:封锁巴基斯坦名人账号、热门影像平台社媒