springboot配置单独的参数文件

本文详细介绍了在SpringBoot中如何使用@Value注解从自定义的properties文件读取配置,而非默认的application.properties。通过创建配置类和指定自定义配置文件路径,实现与默认配置文件的分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

  是不是经常用@Value注解?用过springboot的都知道它是从application.properties文件中引入某个变量的值,是不是已经灰常熟悉了?
  默认在springboot启动后,加载application.properties文件,通过@Value("${}"),即可获取到对应的值,使用非常方便。
在这里插入图片描述

  当然使用久了,发现太多的变量配置到application.properties文件中,就会想到配置一个自定义参数文件,让@Value("${}")这样的方式取值不要再从application.properties中获取,而从自定义的参数文件中获取。

二、理解

  实现方法即重新对PropertyPlaceholderConfigurer类的setLocations()方法重新指定配置文件路径就可以了。
  通过PropertyPlaceholderConfigurer可以实现将上下文属性信息放在一个properties文件中,同时还可以通过System.setProperty(key, value)这种方式,给容器传递其他参数。

三、方法

1、加配置类

  配置方法和spring一样,都是通过加配置类,当然springboot只需要加一个这样的配置类:

import org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * Created by lingsf on 2019/6/20.
 * 重新修改@Value注解注入的路径
 */
@Configuration
public class ValueConfig {

    @Bean
    public PreferencesPlaceholderConfigurer getPreferencesPlaceholderConfigurer(){
        PreferencesPlaceholderConfigurer configurer = new PreferencesPlaceholderConfigurer();
        Resource resource = new ClassPathResource("/data.properties");
        configurer.setLocation(resource);
        return configurer;
    }
}

  其中上边的data.properties即是新的配置文件路径。

2、加参数文件

  然后在resources下加一个data.properties文件即可。
在这里插入图片描述
  最后就可以在data.properties文件里配置自己的参数。

spring.file.uploadpath=c:/upload/wfvideo
3、使用

  使用没有变化,还是使用最方便的@Value("${spring.file.uploadpath}")方式即可,你会发现配置内容都是从data.prooperties文件来了,实现了与application.properties的分离。

四、问题

  又回到开始,为什么@Value注解读配置文件时,会默认从application.properties来获取呢?它是如何知道它呢?

个人理解:

  我还没看源码(看不懂~~),首先application.properties文件在springboot启动后,会加载到容器中,里边的配置参数已经进入到spring上下文,维护进一个地方,并且以map那种形式,key=value键值对存储。

  这时候,你通过对PropertyPlaceholderConfigurer类的setLocations()方法重新指定配置文件,并写了一个data.properties文件,这时候data.properties里也相当于加入到spring前边维护配置信息的map中,但是map的特性都知道,如果有重名的key,那肯定以后者为主。

  所以这么看来,并不是@Value注解,开始就认识application.properties文件,而是它压根不是从application.properties文件中获取东西,也不认识application,而是从它们共同的老板,spring上下文维护的一个配置类中,类似刚才说到的一个map的东西中找东西,而里边的东西默认是application.properties文件中填进去的而已。

  个人感觉可能是这么回事,可能不对~~~

### 如何在Spring Boot中集成和管理配置文件Spring Boot项目中,配置文件的管理和集成是一项非常重要的工作。通过合理的设计和遵循最佳实践,可以显著提升项目的可维护性和扩展性。 #### 使用`application.properties`或`application.yml` Spring Boot支持两种主要的配置文件格式:`.properties` 和 `.yml` 文件。推荐使用 YAML 格式的 `application.yml` 文件,因为它具有更好的层次结构表达能力[^1]。 以下是基于YAML的一个简单示例: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: secret ``` 此配置定义了一个数据库连接字符串以及用户名密码组合。 #### 外部化配置 为了使应用程序能够在不同的环境中运行(开发环境、测试环境、生产环境),可以通过外部化配置来实现不同环境下的参数设置。这通常涉及以下几个方面: - **多环境配置** 可以为每种环境创建单独配置文件,例如 `application-dev.yml`, `application-prod.yml` 等,并通过命令行参数指定激活哪个配置文件: ```bash java -jar myapp.jar --spring.profiles.active=prod ``` - **优先级顺序** Spring Boot会按照一定的优先级加载配置项,其中最高优先级的是命令行参数,其次是系统属性,再者是环境变量等。这种机制允许开发者灵活覆盖默认值。 #### 配置加密与敏感信息保护 对于像数据库密码这样的敏感信息,建议采用加密技术加以保护。Spring Cloud Config提供了对称/非对称密钥的支持来进行配置内容的安全传输和存储。 下面展示了一段关于如何解码已编码字段的例子: ```java @ConfigurationProperties(prefix = "my.datasource") public class DataSourceConfig { private String encryptedPassword; public void setPassword(String encoded){ this.password = decode(encoded); } // 解码逻辑省略... } ``` #### 动态数据源切换实例 当涉及到复杂的业务场景比如多租户架构时,则可能需要用到动态的数据源切换功能。这里给出一个基本框架作为参考[^3]: ```java @Bean @Primary public AbstractRoutingDataSource tenantAwareDataSource() { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("tenantA", dataSourceForTenantA()); targetDataSources.put("tenantB", dataSourceForTenantB()); AbstractRoutingDataSource routingDataSource = new TenantRoutingDataSource(); routingDataSource.setTargetDataSources(targetDataSources); routingDataSource.setDefaultTargetDataSource(defaultDataSource()); return routingDataSource; } // 定义路由规则类 class TenantRoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return TenantContext.getCurrentTenantId(); } } ``` 上述代码片段展示了如何依据当前请求所属的租户ID去决定应该使用的具体数据源对象。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茁壮成长的凌大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值