Spring Boot 约定大于配置:实现自定义配置

文章目录

  • Spring Boot 约定大于配置:实现自定义配置
    • 引言
    • 1. Spring Boot 的约定大于配置
    • 2. 自定义配置的需求
    • 3. 实现自定义配置的步骤
    • 4. 示例:自定义 Spring MVC 配置
      • 4.1 创建自定义配置类
      • 4.2 创建自定义拦截器
      • 4.3 测试自定义配置
    • 5. 其他自定义配置场景
      • 5.1 自定义数据源配置
      • 5.2 自定义 Spring Security 配置
    • 6. 总结


Spring Boot 约定大于配置:实现自定义配置

引言

Spring Boot 是一个基于 Spring 框架的快速开发框架,它的核心理念之一是 “约定大于配置”。这意味着 Spring Boot 提供了许多默认配置,开发者只需要关注自己的业务逻辑,而不需要手动配置大量的细节。然而,在某些情况下,我们可能需要自定义配置来满足特定的需求。本文将介绍如何在 Spring Boot 中实现自定义配置,并通过实现接口和添加 @Configuration 注解来完成这一过程。


1. Spring Boot 的约定大于配置

Spring Boot 的“约定大于配置”理念体现在以下几个方面:

  • 自动配置:Spring Boot 根据项目的依赖自动配置应用程序。例如,如果项目中引入了 spring-boot-starter-web,Spring Boot 会自动配置 Tomcat 和 Spring MVC。
  • 默认配置:Spring Boot 提供了许多默认配置,例如默认的端口号是 8080,默认的静态资源路径是 classpath:/static 等。
  • 简化配置:通过 application.propertiesapplication.yml 文件,开发者可以轻松覆盖默认配置。

这种设计大大减少了开发者的配置工作量,使得开发者可以更专注于业务逻辑的实现。


2. 自定义配置的需求

尽管 Spring Boot 提供了许多默认配置,但在实际开发中,我们可能需要自定义一些配置。例如:

  • 自定义 Bean 的加载顺序。
  • 自定义某些组件的初始化逻辑。
  • 根据环境变量动态加载配置。

为了实现这些需求,Spring Boot 提供了灵活的扩展机制,允许开发者通过实现接口和添加注解来自定义配置。


3. 实现自定义配置的步骤

在 Spring Boot 中,实现自定义配置通常需要以下步骤:

  1. 实现 WebMvcConfigurer 或其他相关接口:根据需求选择合适的接口。
  2. 添加 @Configuration 注解:将自定义配置类标记为 Spring 的配置类。
  3. 重写接口方法:在配置类中重写接口的方法,实现自定义逻辑。

下面通过一个具体的示例来演示如何实现自定义配置。


4. 示例:自定义 Spring MVC 配置

假设我们需要自定义 Spring MVC 的配置,例如添加一个拦截器或修改静态资源路径。可以通过以下步骤实现:

4.1 创建自定义配置类

首先,创建一个类并实现 WebMvcConfigurer 接口。WebMvcConfigurer 是 Spring MVC 提供的接口,用于自定义 MVC 配置。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration // 标记为配置类
public class CustomWebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 添加自定义拦截器registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**"); // 拦截所有请求}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 自定义静态资源路径registry.addResourceHandler("/static/**").addResourceLocations("classpath:/custom-static/");}
}

4.2 创建自定义拦截器

在上面的配置类中,我们添加了一个自定义拦截器。拦截器的实现如下:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("CustomInterceptor: 请求被拦截");return true; // 继续执行后续逻辑}
}

4.3 测试自定义配置

启动 Spring Boot 应用程序后,访问任意路径,控制台会输出 CustomInterceptor: 请求被拦截,说明拦截器已生效。同时,静态资源路径也会被映射到 classpath:/custom-static/


5. 其他自定义配置场景

除了自定义 Spring MVC 配置外,Spring Boot 还支持许多其他自定义配置场景。以下是一些常见的示例:

5.1 自定义数据源配置

通过实现 DataSourceInitializer 接口,可以自定义数据源的初始化逻辑。

import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;@Configuration
public class CustomDataSourceConfig {@Beanpublic DataSource dataSource() {// 自定义数据源配置return new HikariDataSource();}
}

5.2 自定义 Spring Security 配置

通过继承 WebSecurityConfigurerAdapter 类,可以自定义 Spring Security 的配置。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class CustomSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated();}
}

6. 总结

Spring Boot 的“约定大于配置”理念极大地简化了开发流程,但在实际项目中,我们仍然需要根据需求自定义配置。通过实现相关接口(如 WebMvcConfigurer)并添加 @Configuration 注解,开发者可以灵活地扩展和定制 Spring Boot 的默认行为。

自定义配置的核心步骤如下:

  1. 选择合适的接口(如 WebMvcConfigurer)。
  2. 创建配置类并添加 @Configuration 注解。
  3. 重写接口方法,实现自定义逻辑。

希望本文能帮助你更好地理解 Spring Boot 的自定义配置机制,并在实际项目中灵活运用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交易系统优化方案

证券交易系统优化方案 一、选股策略体系 (一)择时策略矩阵 尾盘集中筛选法(14:30后)聚焦量价异动个股,捕捉次日溢价机会早盘转债套利法(9:25-10:00)通过可转债与正股联动性捕捉日内机会龙头战法(全时段)行业板块强度排序,锁定前三大市值龙头容量资金战法(中盘股适用…

在线Doc/Docx转换为PDF格式 超快速转换的一款办公软件 文档快速转换 在线转换免费转换办公软件

小白工具https://www.xiaobaitool.net/files/word-pdf/提供了一项非常实用的在线服务——将Doc或Docx格式的文档快速转换为PDF格式。这项服务不仅操作简单,而且转换效率高,非常适合需要频繁处理文档转换的用户。 服务特点: 批量转换&#x…

java学习总结(四)MyBatis多表

一、多表结构 学生表、班级表、课程表、班级课程表 二、一对一 一个学生只属于一个班级。 查询:id name age gender banjiName SELECT s.id,s.name,s.age,s.gender,b.id AS banjiId,b.name AS banjiName FROM student AS s INNER JOIN banji AS b ON s.banji_id…

大语言模型学习及复习笔记(1)语言模型的发展历程

1.大模型进入人们视野 ChatGPT 于2022年11月底上线 模型名称 发布时间 核心突破 GPT-3 2020年6月 首款千亿参数模型,少样本学习 GPT-3.5-Turbo 2022年11月 对话能力优化,用户级应用落地 GPT-4 2023年3月 多模态、强逻辑推理 GPT-4o / GPT-4…

【NLP】 3. Distributional Similarity in NLP(分布式相似性)

Distributional Similarity in NLP(分布式相似性) 分布式相似性(Distributional Similarity) 是自然语言处理(NLP)中的核心概念,基于“相似的单词出现在相似的上下文中”这一假设。它用于衡量单…

【C#学习】协程等待

来源GPT,仅记录学习 yield return WaitForEndOfFrame() 适用于 渲染结束后再执行代码,但 WebGL 可能不适合这个操作,会拖慢帧率。(渲染得太慢) yield return null; 让代码在下一帧的 Update() 里继续运行,更加流畅。 …

【项目】负载均衡式在线OJ

负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍: 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…

实现“XXX一张图“进行环境设施设备可视化管理

实现“电网一张图”、“铁路一张图”、“水库一张图”、“森林一张图”等概念,本质上是将某一领域的空间数据、设施设备、运行状态等信息整合到一个统一的数字化平台上,实现全域可视化、智能化管理和协同运营。这种“一张图”模式依赖于地理信息系统(GIS)、物联网(IoT)、…

《基於Python的网络爬虫抓包技术研究与应用》

## 摘要 本文探讨了基于Python的网络爬虫抓包技术及其应用。随着互联网数据的快速增长,网络爬虫技术在数据采集和分析中扮演着越来越重要的角色。本研究首先介绍了网络爬虫的基本概念和Python在爬虫开发中的优势,然后深入分析了抓包技术的原理和常用工具…

【蓝桥杯速成】| 1.暴力解题

1高频考点与暴力解题_哔哩哔哩_bilibili 感谢up主分享,以下内容是学习笔记,以c为主,部分python 题目一:维纳的年龄 题目内容 美国数学家维纳(N.Wiener)智力早熟, 11岁就上了大学。他曾在1935~1936年应邀来中国清华大…

[C++Qt] 槽函数收不到信号问题(信号的注册)

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

从零开始用AI开发游戏(一)

1. 核心玩法设计 核心目标:玩家需在随机生成的3D迷宫中寻找出口,躲避陷阱、收集道具、解开谜题。核心机制: 随机生成迷宫:每次游戏生成不同结构的迷宫(递归分割算法或深度优先搜索)。第一人称视角&#xf…

基于ssm的宠物医院信息管理系统(全套)

一、系统架构 前端:html | layui | vue | element-ui 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat | idea | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页…

【CXX】6.7 SharedPtr<T> — std::shared_ptr<T>

std::shared_ptr 的 Rust 绑定称为 SharedPtr。 限制: SharedPtr 不支持 T 为不透明的 Rust 类型。对于在语言边界上传递不透明 Rust 类型的所有权,应改用 Box(C 中的 rust::Box)。 示例 // src/main.rsuse std::ops::Deref; …

利用python生成excel中模板范围对应的shape文件

利用python生成excel中模板范围对应的shape文件 # -*- coding: utf-8 -*- import os.pathimport pandas as pd from shapely.geometry import Polygon from shapely.wkt import dumps import argparse# 创建解析器 parser argparse.ArgumentParser(description"这是一个…

cursor使用

引入私有文档 设置-> Features->下滑找到Docs url后边多加一个 / 可以拉取url下所有的页面(子页面,子目录),不加只拉取url当前页面 使用 选择 Docs 回车 选择 文档 直接解析链接 链接 回车 搜索引擎 web 对比git版本差异 git 选择其中一个 g…

达梦数据库中插入导出图片的方法与应用

达梦数据库中插入导出图片的方法与应用 在数据库的实际应用场景中,图片存储是一项常见且重要的需求。以电商平台为例,商品展示图片是吸引消费者的关键元素;而在社交软件里,用户头像更是个人形象的直观体现。针对达梦数据库&#…

【云原生】动态资源分配(DRA)深度洞察报告

1. DRA 的发展与设计灵感 Kubernetes 早期通过 Device Plugin(设备插件)机制支持 GPU、NIC 等特殊硬件,将节点上可用设备数量上报给 kubelet 和调度器。但设备插件模式存在局限:调度器只能根据节点标签等属性粗粒度筛选&#xff…

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

Python 实现的采集诸葛灵签

Python 实现的采集诸葛灵签 项目介绍 这是一个基于 Python 开发的诸葛灵签数据采集和展示项目。通过爬虫技术获取诸葛神签的签文和解签内容,并提供数据存储和查询功能。 项目结构 zhuge/├── zhuge_scraper.py # 爬虫主程序├── zhuge_pages/ # 数据存储目录…