Java案例怎么读取YML配置?

wen java案例 20

本文目录导读:

Java案例怎么读取YML配置?

  1. 使用SnakeYAML(最基础的方式)
  2. 使用Jackson(推荐方式)
  3. Spring Boot方式
  4. 资源文件读取(classpath下的yml)
  5. 选择建议

在Java中读取YML配置文件有多种方式,以下是几种常见的方法:

使用SnakeYAML(最基础的方式)

Maven依赖

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.2</version>
</dependency>

示例代码

import org.yaml.snakeyaml.Yaml;
import java.io.*;
import java.util.Map;
public class YamlReader {
    public static void main(String[] args) {
        Yaml yaml = new Yaml();
        try (InputStream inputStream = new FileInputStream("config.yml")) {
            // 读取为Map
            Map<String, Object> config = yaml.load(inputStream);
            // 获取配置项
            String name = (String) config.get("name");
            Map<String, Object> database = (Map<String, Object>) config.get("database");
            System.out.println("Name: " + name);
            System.out.println("Database URL: " + database.get("url"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

config.yml示例

name: myapp
database:
  url: jdbc:mysql://localhost:3306/mydb
  username: root
  password: secret
server:
  port: 8080
  host: 0.0.0.0

使用Jackson(推荐方式)

Maven依赖

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.16.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.16.0</version>
</dependency>

读取为Map

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
import java.util.Map;
public class JacksonYamlReader {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        // 读取为Map
        Map<String, Object> config = mapper.readValue(
            new File("config.yml"), 
            Map.class
        );
        System.out.println(config);
    }
}

读取为Java对象(推荐)

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
public class JacksonObjectReader {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        AppConfig config = mapper.readValue(
            new File("config.yml"), 
            AppConfig.class
        );
        System.out.println("Name: " + config.getName());
        System.out.println("Port: " + config.getServer().getPort());
    }
}
// 对应的Java Bean
class AppConfig {
    private String name;
    private DatabaseConfig database;
    private ServerConfig server;
    // getters and setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public DatabaseConfig getDatabase() { return database; }
    public void setDatabase(DatabaseConfig database) { this.database = database; }
    public ServerConfig getServer() { return server; }
    public void setServer(ServerConfig server) { this.server = server; }
}
class DatabaseConfig {
    private String url;
    private String username;
    private String password;
    // getters and setters
    public String getUrl() { return url; }
    public void setUrl(String url) { this.url = url; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}
class ServerConfig {
    private int port;
    private String host;
    // getters and setters
    public int getPort() { return port; }
    public void setPort(int port) { this.port = port; }
    public String getHost() { return host; }
    public void setHost(String host) { this.host = host; }
}

Spring Boot方式

如果在Spring Boot项目中,可以直接使用@ConfigurationProperties

application.yml

app:
  name: myapp
  database:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret
  server:
    port: 8080
    host: 0.0.0.0

Java配置类

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private DatabaseConfig database;
    private ServerConfig server;
    // getters and setters
}
class DatabaseConfig {
    private String url;
    private String username;
    private String password;
    // getters and setters
}
class ServerConfig {
    private int port;
    private String host;
    // getters and setters
}

使用方式

@Service
public class AppService {
    @Autowired
    private AppConfig appConfig;
    public void printConfig() {
        System.out.println(appConfig.getName());
        System.out.println(appConfig.getDatabase().getUrl());
    }
}

资源文件读取(classpath下的yml)

import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.Map;
public class ClasspathYamlReader {
    public static void main(String[] args) {
        Yaml yaml = new Yaml();
        // 从classpath读取
        try (InputStream inputStream = 
                ClasspathYamlReader.class
                    .getClassLoader()
                    .getResourceAsStream("config.yml")) {
            if (inputStream != null) {
                Map<String, Object> config = yaml.load(inputStream);
                System.out.println(config);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

选择建议

  1. 简单项目:使用SnakeYAML
  2. 需要对象映射:使用Jackson(推荐)
  3. Spring Boot项目:使用@ConfigurationProperties(最方便)

Jackson方式既能处理简单配置,也能进行复杂对象映射,是大多数项目的最佳选择。

抱歉,评论功能暂时关闭!