如何在spring boot中使用自己在yml配置的自定义参数

例如这样的配置:

selfPara:
  fastApiIP: 127.0.0.1

在Spring Boot中,可以通过以下两种方式读取application.yml中的自定义参数:


方式一:使用@Value注解直接注入

1. 确认YAML格式

确保参数层级缩进正确(使用2或4空格缩进):

selfPara:
  fastApiIP: 127.0.0.1
2. 在代码中使用@Value注入
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component // 确保类被Spring管理
public class MyConfigComponent {

    @Value("${selfPara.fastApiIP}")  // 使用${}占位符语法
    private String fastApiIP;

    public void printConfig() {
        System.out.println("FastAPI IP: " + fastApiIP);
    }
}

方式二:使用@ConfigurationProperties批量绑定

1. 创建配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "selfPara")  // 绑定前缀为selfPara的属性
public class SelfParaConfig {

    private String fastApiIP;  // 字段名必须与yaml中的子属性名完全一致

    // Getter和Setter必须存在
    public String getFastApiIP() {
        return fastApiIP;
    }

    public void setFastApiIP(String fastApiIP) {
        this.fastApiIP = fastApiIP;
    }
}
2. 在需要的地方注入使用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final SelfParaConfig selfParaConfig;

    @Autowired  // 通过构造器注入
    public MyService(SelfParaConfig selfParaConfig) {
        this.selfParaConfig = selfParaConfig;
    }

    public void connectToApi() {
        String ip = selfParaConfig.getFastApiIP();
        System.out.println("Connecting to API at: " + ip);
    }
}

其他注意事项

  1. 启用配置属性支持

    • 如果使用@ConfigurationProperties,确保主类或配置类上有@EnableConfigurationProperties
      @SpringBootApplication
      @EnableConfigurationProperties(SelfParaConfig.class)
      public class VideoFrameApplication {
          public static void main(String[] args) {
              SpringApplication.run(VideoFrameApplication.class, args);
          }
      }
      
  2. 配置元数据提示(可选)

    • pom.xml中添加依赖,以便IDE能识别自定义参数:
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-configuration-processor</artifactId>
          <optional>true</optional>
      </dependency>
      
    • 重新编译后,IDE会提供参数名称的自动补全和文档提示。
  3. 属性未找到错误处理

    • 如果启动时报错Could not resolve placeholder 'selfPara.fastApiIP',检查:
      • YAML缩进是否正确
      • 属性名是否拼写错误
      • 是否在正确的application.yml文件中配置

示例:在Controller中使用

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    // 方式一:直接注入
    @Value("${selfPara.fastApiIP}")
    private String fastApiIP;

    // 方式二:通过配置类注入
    private final SelfParaConfig selfParaConfig;

    @Autowired
    public MyController(SelfParaConfig selfParaConfig) {
        this.selfParaConfig = selfParaConfig;
    }

    @GetMapping("/ip")
    public String getIp() {
        // 两种方式均可使用
        return "Direct Value: " + fastApiIP + 
               ", Config Class: " + selfParaConfig.getFastApiIP();
    }
}

总结

方式适用场景优点缺点
@Value简单、少量属性的注入快速直接不适合多个关联属性
@ConfigurationProperties需要批量绑定多个关联属性结构化、类型安全、支持验证需要编写配置类

选择适合你场景的方式即可。如果参数需要跨多个类使用,推荐使用方式二。

<think>我们参考用户提供的引用内容,特别是引用[3]中关于自定义配置类的描述,来回答如何在Spring Boot中创建和使用自定义配置类。 步骤分为两个主要部分:创建配置类和使用配置类。 1. 创建配置类: 在Spring Boot中,我们可以通过定义一个带有`@Configuration`注解的类来声明一个配置类。同时,如果这个配置类需要绑定配置文件中的属性,我们可以使用`@ConfigurationProperties`注解,并指定一个前缀(prefix)来映射配置文件中的属性。 示例代码(参考引用[3]): ```java import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration // 声明这是一个配置类,同时也是一个Spring Bean @ConfigurationProperties(prefix = "myapp") // 绑定配置文件中以myapp开头的属性 public class MyAppConfig { private String apiUrl; private String apiKey; // 必须提供getter和setter方法,Spring Boot会通过它们注入属性值 public String getApiUrl() { return apiUrl; } public void setApiUrl(String apiUrl) { this.apiUrl = apiUrl; } public String getApiKey() { return apiKey; } public void setApiKey(String apiKey) { this.apiKey = apiKey; } } ``` 在配置文件(如application.properties)中,我们可以这样设置属性: ```properties myapp.api-url=http://example.com/api myapp.api-key=123456 ``` 注意:在properties文件中,属性名可以使用横线分隔(kebab-case)的形式,如`api-url`,也可以使用驼峰形式(apiUrl)?实际上,Spring Boot宽松的绑定规则允许我们将配置文件中的属性名与Java类中的字段名进行映射,支持多种格式(如驼峰、横线分隔、下划线等)。但是,为了统一,通常我们在配置文件使用横线分隔的小写字母,而在Java类中使用驼峰命名。 2. 使用配置类: 创建了配置类后,我们可以在其他Spring管理的Bean(如Service、Controller等)中注入这个配置类并使用。 示例:在Service中使用配置类 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { private final MyAppConfig myAppConfig; // 通过构造器注入配置类 @Autowired public MyService(MyAppConfig myAppConfig) { this.myAppConfig = myAppConfig; } public void doSomething() { String apiUrl = myAppConfig.getApiUrl(); String apiKey = myAppConfig.getApiKey(); // 使用apiUrl和apiKey进行后续操作 } } ``` 另外,我们也可以使用`@EnableConfigurationProperties`注解来启用配置属性。如果我们在配置类上使用了`@ConfigurationProperties`但没有使用`@Component`(或`@Configuration`等)将其注册为Bean,那么我们需要在某个配置类上使用`@EnableConfigurationProperties`来注册这个配置属性类。但是,在上面的例子中,我们在配置类上同时使用了`@Configuration`和`@ConfigurationProperties`,因此它会被自动注册为Bean,无需额外启用。 补充:如果不想在配置类上使用`@Configuration`,也可以单独使用`@ConfigurationProperties`,然后在Spring Boot的主配置类(通常带有`@SpringBootApplication`)上使用`@EnableConfigurationProperties`来启用这个配置类。例如: ```java @SpringBootApplication @EnableConfigurationProperties(MyAppConfig.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样,`MyAppConfig`就会被注册为Bean,并可以从配置文件中注入属性。 总结步骤: - 创建配置类,使用`@ConfigurationProperties(prefix="...")`指定前缀,并提供字段的getter和setter。 - 在配置文件中(如application.properties)设置对应前缀的属性。 - 在需要的地方注入配置类并使用。 注意:确保配置类被Spring扫描到(通常放在主应用的同包或子包下),或者通过上述方式显式启用。 通过这种方式,我们可以将相关的配置属性集中在一个类中管理,提高代码的可维护性和可读性[^3]。 另外,引用[1]和[2]也提到了其他自定义配置项的方式(如@Value和Environment),但配置类的方式(使用@ConfigurationProperties)更适用于将一组相关的属性绑定到一个对象中,是更推荐的方式。 引用[4]提到了Spring Boot的自动配置机制,我们的自定义配置类与自动配置并不冲突,而且自定义配置类可以覆盖自动配置的某些属性(如果属性名相同且优先级更高)[^4]。 引用[5]是关于加密配置的内容,与本问题关系不大,故不采用。 因此,在Spring Boot中创建和使用自定义配置类,主要就是通过`@ConfigurationProperties`和`@Configuration`(或`@EnableConfigurationProperties`)来实现。 下面,我们生成相关问题:</think>### 如何在 Spring Boot 中创建和使用自定义配置类 在 Spring Boot 中创建和使用自定义配置类主要分为以下三个步骤,结合引用内容详细说明: --- #### 1. **创建配置类** 通过 `@Configuration` 和 `@ConfigurationProperties` 注解定义配置类,绑定配置文件中的属性: ```java import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration // 声明为配置类 @ConfigurationProperties(prefix = "myapp") // 绑定配置文件前缀 public class MyAppConfig { private String apiUrl; private String apiKey; // 必须提供 getter/setter 方法 public String getApiUrl() { return apiUrl; } public void setApiUrl(String apiUrl) { this.apiUrl = apiUrl; } public String getApiKey() { return apiKey; } public void setApiKey(String apiKey) { this.apiKey = apiKey; } } ``` - **`@Configuration`**:标识为 Spring 配置类,会被容器扫描[^3]。 - **`@ConfigurationProperties(prefix = "myapp")`**:绑定 `application.properties` 或 `application.yml` 中以 `myapp` 开头的属性[^1][^3]。 --- #### 2. **在配置文件中定义属性** 在 `application.properties` 或 `application.yml` 中添加自定义属性: ```properties # application.properties myapp.api-url=https://api.example.com myapp.api-key=SECRET_KEY_123 ``` 或 YAML 格式: ```yaml # application.yml myapp: api-url: https://api.example.com api-key: SECRET_KEY_123 ``` > **注意**:属性名支持松散绑定(如 `apiUrl` 可写为 `api-url`)[^2]。 --- #### 3. **注入并使用配置类** 通过依赖注入在 Service、Controller 等组件中使用: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ApiService { private final MyAppConfig myAppConfig; // 通过构造器注入 @Autowired public ApiService(MyAppConfig myAppConfig) { this.myAppConfig = myAppConfig; } public void callApi() { String url = myAppConfig.getApiUrl(); // https://api.example.com String key = myAppConfig.getApiKey(); // SECRET_KEY_123 // 使用配置调用API... } } ``` - **注入方式**:支持构造器注入、字段注入或 `@Autowired` 注入[^3]。 - **自动刷新**:结合 `@RefreshScope` 可实现配置热更新(需配合 Spring Cloud Config)。 --- #### 关键机制说明 1. **与自动配置的关系** Spring Boot 的 `@EnableAutoConfiguration` 会加载默认配置(如数据源),而自定义配置类优先级更高,可覆盖默认行为[^4]。 2. **配置优先级** 属性加载优先级:命令行参数 > 系统变量 > `application.properties` > 默认配置自定义配置类通过 `@ConfigurationProperties` 绑定高优先级属性[^4]。 3. **敏感信息加密** 结合 `jasypt-spring-boot` 可加密配置中的敏感信息(如密码)[^5]: ```properties myapp.api-key=ENC(加密后的字符串) ``` --- ### 总结流程 ```mermaid graph TD A[创建配置类] --> B[添加@Configuration和@ConfigurationProperties] B --> C[定义属性字段和getter/setter] C --> D[在application.properties中配置属性] D --> E[通过@Autowired注入配置类] E --> F[在业务代码中使用配置] ``` 通过自定义配置类,可实现: 1. 集中管理业务相关配置 2. 类型安全的属性绑定(避免 `@Value` 硬编码) 3.Spring Boot 自动配置无缝集成[^3][^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值