目录

1、为什么需要使用配置文件?

2、Java 读取配置文件常用的几种方式

(1)使用 Properties 类读取 .properties 文件

(2)使用 XML 读取 .xml 文件

(3)使用 JSON 读取 .json 文件

(4)使用注解读取配置信息

3、Spring 读取配置文件常用的几种方式

(1)使用 PropertyPlaceholderConfigurer 类读取 .properties 文件

(2)使用 @PropertySource 注解读取 .properties 文件

(3)使用 Environment 类读取配置信息

4、SpringBoot 读取配置文件常用的几种方式

(1)使用 @Value 注解读取配置文件

(2)使用 @ConfigurationProperties 注解读取配置文件

(3)使用 Environment 读取配置文件


1、为什么需要使用配置文件?

        配置文件是一种存储应用程序配置信息的文本文件,它可以存储诸如数据库连接字符串、应用程序路径、调试开关、日志级别等一些与应用程序相关的信息。在实际应用程序开发中,使用配置文件可以有以下好处:

  1. 避免硬编码:硬编码是指将应用程序的配置信息直接嵌入到代码中,这样的代码不仅难以维护,而且需要对代码进行重新编译才能修改这些配置信息。使用配置文件可以将这些信息与代码分离,使得应用程序更加灵活。
  2. 提高可移植性:不同的应用程序在不同的环境下可能需要不同的配置信息,使用配置文件可以使得应用程序的配置信息更易于迁移,使得应用程序在不同的环境下都可以正常运行。
  3. 提高安全性:某些敏感的配置信息,如数据库连接字符串、密码等,不应该直接写在代码中,而是应该保存在安全的地方,使用配置文件可以将这些敏感信息保存在加密的配置文件中,提高了应用程序的安全性。
  4. 方便管理:使用配置文件可以使得应用程序的配置信息更易于管理,如通过配置文件可以很容易地对不同的配置信息进行分类、分组和排序,便于维护和管理。

可以使得应用程序更加灵活、可移植、安全和易于管理。

2、Java 读取配置文件常用的几种方式

        在Java中,读取配置文件通常有以下几种方案:

(1)使用 Properties 类读取 .properties 文件

        在Java中,Properties是一个非常常用的类,用于读取和写入.properties文件。Properties类继承自Hashtable,因此也可以用来存储键值对。

        Properties类可以将键值对保存在.properties文件中,该文件通常是一个文本文件,每行都包含一个键值对,键值对之间用等号“=”分隔。可以通过Properties类的load()方法来读取.properties文件,并将其中的键值对加载到Properties对象中。可以使用getProperty()方法获取特定键的值,也可以使用setProperty()方法来设置键值对。最后,通过store()方法,可以将Properties对象中的键值对写回到.properties文件中。

        以下是使用Properties类的示例:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        try {
            // 从文件中读取配置信息
            FileInputStream fis = new FileInputStream("config.properties");
            props.load(fis);
            fis.close();

            // 获取属性值
            String name = props.getProperty("name");
            int age = Integer.parseInt(props.getProperty("age"));

            // 输出属性值
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);

            // 设置属性值
            props.setProperty("address", "Beijing, China");

            // 将属性写回到文件中
            FileOutputStream fos = new FileOutputStream("config.properties");
            props.store(fos, "Updated address");
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

        上面的示例中,我们使用Properties类读取了一个名为config.properties的文件,并获取了其中的name和age属性。然后,我们又使用setProperty()方法设置了address属性,并通过store()方法将Properties对象中的属性写回到config.properties文件中。

(2)使用 XML 读取 .xml 文件

        Java也提供了读取XML文件的方式,可以使用DOM(文档对象模型)或SAX(简单 API for XML)等技术来解析XML文件,并获取其中的配置信息。

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XMLExample {
    public static void main(String[] args) {
        try {
            File xmlFile = new File("config.xml");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(xmlFile);
            Element root = doc.getDocumentElement();
            NodeList nodeList = root.getElementsByTagName("key");
            String value = nodeList.item(0).getTextContent();
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(3)使用 JSON 读取 .json 文件

        与XML类似,Java也支持读取JSON格式的配置文件。可以使用JSON库如Jackson或Gson来读取.json文件。

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

public class JsonExample {
    public static void main(String[] args) {
        try {
            String jsonStr = new String(Files.readAllBytes(Paths.get("config.json")), StandardCharsets.UTF_8);
            JsonObject jsonObject = new Gson().fromJson(jsonStr, JsonObject.class);
            String value = jsonObject.get("key").getAsString();
            System.out.println(value);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(4)使用注解读取配置信息

        Java中也可以使用注解来读取配置信息。可以自定义注解,并在程序中使用反射来获取注解中的配置信息。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Config {
    String key();
    String value();
}

@Config(key = "key", value = "value")
public class AnnotationExample {
    public static void main(String[] args) {
        Class<?> cls = AnnotationExample.class;
        Config config = cls.getAnnotation(Config.class);
        String key = config.key();
        String value = config.value();
        System.out.println(key + "=" + value);
    }
}

        无论使用哪种方案,都需要根据具体的需求来选择最适合的方案。一般来说,如果配置文件比较简单,可以使用Properties类;如果需要处理复杂的配置信息,可以考虑使用XML或JSON;如果需要灵活配置,可以考虑使用注解。

3、Spring 读取配置文件常用的几种方式

        Spring 提供了多种读取配置文件的方式,下面介绍几种常用的方式:

(1)使用 PropertyPlaceholderConfigurer 类读取 .properties 文件

        PropertyPlaceholderConfigurer 是 Spring 提供的一个用于解析 .properties 配置文件的工具类。可以使用如下方式配置 PropertyPlaceholderConfigurer:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:config.properties</value>
        </list>
    </property>
</bean>

        在上述配置中,使用 locations 属性指定了配置文件的位置,可以同时指定多个配置文件。

        读取配置文件的方式如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PropertyPlaceholderConfigurerExample {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        String value = context.getBean("key", String.class);
        System.out.println(value);
    }
}

(2)使用 @PropertySource 注解读取 .properties 文件

        @PropertySource 是 Spring 提供的一个用于读取 .properties 配置文件的注解。可以使用如下方式配置 @PropertySource:

@Configuration
@PropertySource("classpath:config.properties")
public class Config {
    @Value("${key}")
    private String key;
}

        在上述配置中,使用 @PropertySource 注解指定了配置文件的位置,并使用 @Value 注解将配置文件中的属性注入到类的成员变量中。

        读取配置文件的方式如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class PropertySourceExample {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Config config = context.getBean(Config.class);
        String value = config.getKey();
        System.out.println(value);
    }
}

(3)使用 Environment 类读取配置信息

        Spring Framework 中的 Environment 接口提供了访问应用程序配置属性的一致方式,包括系统属性、环境变量、命令行参数、属性文件等。

        通过使用 Environment 接口,我们可以方便地访问和配置应用程序的属性,而无需直接操作系统属性、环境变量、命令行参数等。同时,Spring 提供了许多实现了 Environment 接口的类,如 StandardEnvironment、ConfigurableEnvironment、MutablePropertySources 等,这些类提供了更加灵活的属性配置和管理方式。

        除了上述方法,Environment 接口还提供了一些其他的方法,如 getPropertySources()、getConversionService()、getSystemEnvironment()、getSystemProperties() 等。这些方法都是与应用程序属性相关的,可以方便地对属性进行操作和管理。

        使用 Spring Framework 的 Environment 类可以方便地读取配置信息。下面是具体的操作步骤:

        1)配置属性文件

        首先,在 Spring 应用程序中,我们通常使用属性文件来存储应用程序的配置信息。可以在 classpath 下创建一个 properties 文件,用于存储应用程序的配置信息。例如,可以创建一个名为 application.properties 的文件,其中包含了一些键值对,如下所示:

jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

        2)加载属性文件

        接下来,我们需要在 Spring 应用程序中加载这个属性文件。可以使用 Spring 的 PropertySourcesPlaceholderConfigurer 来加载属性文件,该类可以将属性文件中的键值对解析成应用程序中的属性值。例如,可以在 Spring 的配置文件中添加以下配置:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:application.properties</value>
    </property>
</bean>

        这样,Spring 应用程序就会自动加载并解析这个属性文件,并将其中的键值对存储到应用程序的属性中。

        3)使用 Environment 类读取属性值

        最后,我们可以使用 Spring 的 Environment 类来读取应用程序中的属性值。例如,可以在 Spring Bean 中注入 Environment 类型的属性,并通过其 getProperty() 方法来读取属性值。例如,可以创建一个名为 JdbcConfig 的 Bean,用于配置应用程序的 JDBC 连接,如下所示:

@Component
public class JdbcConfig {
    @Autowired
    private Environment env;

    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.username"));
        dataSource.setPassword(env.getProperty("jdbc.password"));
        return dataSource;
    }
}

        在上述代码中,我们注入了一个类型为 Environment 的属性 env,并通过其 getProperty() 方法来读取属性值。这样,我们就可以方便地读取应用程序中的属性信息了。

4、SpringBoot 读取配置文件常用的几种方式

        在 Spring Boot 中,可以使用 @Value@ConfigurationPropertiesEnvironment 等方式读取配置文件。

(1)使用 @Value 注解读取配置文件

        可以使用 @Value 注解读取配置文件中的属性,如下所示:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyBean {
    @Value("${my.property}")
    private String myProperty;
}

        在上述代码中,使用 @Value 注解注入了 my.property 属性的值到 myProperty 字段中。

(2)使用 @ConfigurationProperties 注解读取配置文件

        可以使用 @ConfigurationProperties 注解读取配置文件中的属性,并将其注入到 Bean 中,如下所示:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "my")
public class MyBean {
    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

        在上述代码中,使用 @ConfigurationProperties 注解指定了 prefix,表示要读取配置文件中以 my. 开头的属性,并将其注入到 MyBean 中。

(3)使用 Environment 读取配置文件

        在 Spring Boot 应用程序中,使用 Environment 类读取属性值由于自动配置的原因,Spring Boot 会自动加载并解析 application.properties 或 application.yml 文件中的配置信息,并将其存储到 Environment 类中。因此,我们无需显式地加载属性文件,也无需使用 PropertySourcesPlaceholderConfigurer 类来解析属性文件中的键值对。有关使用 Environment 类读取属性值,请参照Spring的方式,在此不作重复赘述。

// 其实读取配置文件的过程,就是使用 Java I/O 流进行读取和写入数据的过程,Java I/O 流将不同的数据源和目标统一封装成了流(Stream),使得数据读写更加灵活和通用。