config是干什么的?
在 Java 后端开发中,“config”(通常指配置相关的代码、文件或模块)的核心作用是集中管理项目的配置信息,避免将固定值硬编码到业务代码里,让配置更灵活、可维护。
简单说,它就像项目的 “控制面板”—— 比如数据库的连接地址、端口号,接口调用的密钥,日志的输出级别,甚至是不同环境(开发 / 测试 / 生产)的参数差异,都可以通过 config 统一管理,不用改代码就能调整项目行为。
一、为什么需要 config?(解决的核心问题)
如果没有 config,你可能会在代码里写死这样的内容:
// 硬编码的问题:改数据库地址要改代码、重新部署!
String dbUrl = "jdbc:mysql://localhost:3306/meal_db";
String dbUser = "root";
String dbPwd = "123456";
二、Java 后端中 config 的常见形式
根据项目框架(如 Spring Boot、Spring Cloud),config 主要有以下两种形态:
1. 配置文件(最基础的 config)
是后端项目最常用的配置载体,直接存储键值对或结构化配置,常见格式有:
- .properties(简单键值对,Spring 早期常用):
# 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/meal_db spring.datasource.username=root spring.datasource.password=123456 # 服务器端口 server.port=8080
.yml/.yaml(结构化更强,Spring Boot 主流,缩进敏感):
spring:datasource:url: jdbc:mysql://localhost:3306/meal_dbusername: rootpassword: 123456 server:port: 8080
- .json(较少用于 Spring 项目,更多在中间件配置或自定义场景)
2. 配置类(代码层面的 config,配合框架使用)
在 Spring Boot 中,除了配置文件,还会用标注 @Configuration 的 Java 类来定义 “动态配置”—— 比如数据库连接池、线程池、拦截器、第三方接口客户端(如 Redis、OSS)的初始化逻辑,本质是将 “配置” 转化为可被 Spring 管理的 Bean。
举个例子(数据库相关的配置类)
// 标注 @Configuration,告诉 Spring 这是一个配置类
@Configuration
public class DataSourceConfig {// 从配置文件中读取 db.url、db.username 等参数(@Value 注解)@Value("${spring.datasource.url}")private String dbUrl;@Value("${spring.datasource.username}")private String dbUser;@Value("${spring.datasource.password}")private String dbPwd;// 定义一个数据库连接池 Bean,供项目全局使用@Beanpublic DataSource dataSource() {HikariConfig config = new HikariConfig();config.setJdbcUrl(dbUrl); // 使用配置文件中的参数config.setUsername(dbUser);config.setPassword(dbPwd);return new HikariDataSource(config);}
}
三、config 的核心能力(后端常用场景)
多环境切换开发、测试、生产环境的配置不同(比如开发用本地数据库,生产用云数据库),通过 config 可以快速切换:
新建不同环境的配置文件:application-dev.yml(开发)、application-prod.yml(生产)
在主配置文件 application.yml 中指定激活的环境:spring:profiles:active: dev # 激活开发环境,上线时改为 prod 即可
动态配置刷新传统配置改了要重启项目,而通过 Spring Cloud Config、Nacos、Apollo 等配置中心,可以实现 “改配置不重启项目”—— 比如线上需要调整接口超时时间,直接在配置中心修改,项目会自动感知并生效
敏感配置加密数据库密码、接口密钥等敏感信息,不能明文存放在配置文件里。通过 config 配合加密工具(如 Jasypt),可以将敏感信息加密存储,项目启动时自动解密:
# 加密后的密码(不是明文 123456) spring.datasource.password=ENC(abc123xyz...)
四、具体例子
/*** Web配置类,注册拦截器*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/api/**") // 拦截所有API请求.excludePathPatterns("/api/auth/**"); // 排除认证相关接口}
}
这段代码是一个 Spring Boot 中的 Web 配置类,主要作用是注册和配置拦截器(这里是 JWT 拦截器),用于对接口请求进行统一处理(比如身份验证)。
我们来逐部分解析:
1. 类定义与注解
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Configuration
:标注这是一个配置类,Spring 会自动扫描并加载它,相当于传统的 XML 配置文件。implements WebMvcConfigurer
:实现 Spring 的WebMvcConfigurer
接口,该接口提供了一系列用于配置 Spring MVC 的方法(比如拦截器、视图解析器、跨域等),这里主要用到它的拦截器配置能力。
2. 注入 JWT 拦截器
@Autowired
private JwtInterceptor jwtInterceptor;
@Autowired
:自动注入一个JwtInterceptor
实例(这是一个自定义的拦截器,用于处理 JWT 令牌验证)。- 拦截器(
Interceptor
)是 Spring MVC 中的一种组件,能在请求到达控制器(Controller)之前、之后或视图渲染后进行一些通用处理(比如登录验证、日志记录)。
3. 配置拦截器规则
@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/api/**") // 拦截所有API请求.excludePathPatterns("/api/auth/**"); // 排除认证相关接口
}
这是核心方法,用于注册拦截器并定义拦截规则:
registry.addInterceptor(jwtInterceptor)
:将jwtInterceptor
拦截器注册到 Spring 容器中,使其生效。.addPathPatterns("/api/**")
:指定需要被拦截的请求路径。/api/**
是通配符,表示所有以/api/
开头的请求(比如/api/user/get
、/api/order/add
等)都会被这个拦截器处理。.excludePathPatterns("/api/auth/**")
:指定需要排除拦截的请求路径。/api/auth/**
表示所有以/api/auth/
开头的请求(比如登录/api/auth/login
、注册/api/auth/register
)不会被拦截 —— 因为用户登录前还没有 JWT 令牌,不能拦截这些接口。
整体作用
这个配置类的最终效果是:
- 所有
/api/
开头的接口请求,在到达 Controller 之前,都会先经过JwtInterceptor
拦截器的处理(比如验证请求头中是否携带有效的 JWT 令牌,验证用户身份)。 - 但登录、注册等
/api/auth/
开头的接口例外,不会被拦截,允许匿名访问。
这是后端项目中实现接口权限控制的典型方式,通过拦截器统一验证用户身份,避免在每个 Controller 方法中重复编写验证逻辑,既规范又便于维护。