You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring XML配置中读取application.yml文件?

问题描述

我在项目中使用基于XML的配置,想要读取application.yml文件,文件内容如下:

vtp:
  config:
      priority: 
        2:
          country: 'US'
          countryFriend: ['UK','AG']
        3:
          country: 'IN'
          countryFriend: ['UK','AG']
        4:
          country: 'PO'
          countryFriend: ['NL']
        5:
          country: 'KN'
          countryFriend: ['DN']

我已经能通过创建POJO类结合注解在Spring Boot中实现读取,代码如下:

@Configuration
@ConfigurationProperties(prefix = "vtp.config")
@PropertySource(value = "classpath:application.yml")
public class MeraPriorityConfig {
    private Map<String, Config> priority;

    public Map<String, Config> getPriority() {
        return priority;
    }

    public void setPriority(Map<String, Config> priority) {
        this.priority = priority;
    }
}

请问如何使用基于XML的配置实现相同功能?


基于XML配置实现读取YAML属性的方案

要实现和注解方式一致的属性映射效果,按以下步骤操作:

1. 确保依赖齐全

如果是Maven项目,需引入解析YAML的必要依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
</dependency>

2. 保留原POJO类结构

移除MeraPriorityConfig上的注解,保留标准的getter/setter方法;同时确保Config类也具备完整的属性访问方法:

// Config类
public class Config {
    private String country;
    private List<String> countryFriend;

    public String getCountry() { return country; }
    public void setCountry(String country) { this.country = country; }
    public List<String> getCountryFriend() { return countryFriend; }
    public void setCountryFriend(List<String> countryFriend) { this.countryFriend = countryFriend; }
}

// MeraPriorityConfig类
public class MeraPriorityConfig {
    private Map<String, Config> priority;

    public Map<String, Config> getPriority() { return priority; }
    public void setPriority(Map<String, Config> priority) { this.priority = priority; }
}

3. 编写XML配置文件

创建Spring XML配置文件(例如applicationContext.xml),完成YAML加载、属性源注册和Bean绑定:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:configuration="http://www.springframework.org/schema/configuration"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/configuration
           https://www.springframework.org/schema/configuration/spring-configuration.xsd">

    <!-- 加载并解析application.yml文件 -->
    <bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
        <property name="resources" value="classpath:application.yml"/>
    </bean>

    <!-- 注册属性源,让Spring识别YAML中的属性 -->
    <bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="properties" ref="yamlProperties"/>
    </bean>

    <!-- 绑定属性前缀到配置Bean -->
    <configuration:properties-bean id="meraPriorityConfig" 
                                   class="com.yourpackage.MeraPriorityConfig" 
                                   prefix="vtp.config"/>
</beans>

注意替换com.yourpackage为实际的包路径。

4. 加载XML配置

在Spring Boot启动类上添加@ImportResource注解,引入XML配置文件:

@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

5. 使用配置Bean

通过@Autowired注入MeraPriorityConfig即可使用配置属性:

@Service
public class YourService {
    @Autowired
    private MeraPriorityConfig meraPriorityConfig;

    public void processConfig() {
        Map<String, Config> priorityMap = meraPriorityConfig.getPriority();
        // 业务逻辑处理
    }
}

内容的提问来源于stack exchange,提问作者PAA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:05:24