目录
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、为什么需要使用配置文件?
配置文件是一种存储应用程序配置信息的文本文件,它可以存储诸如数据库连接字符串、应用程序路径、调试开关、日志级别等一些与应用程序相关的信息。在实际应用程序开发中,使用配置文件可以有以下好处:
- 避免硬编码:硬编码是指将应用程序的配置信息直接嵌入到代码中,这样的代码不仅难以维护,而且需要对代码进行重新编译才能修改这些配置信息。使用配置文件可以将这些信息与代码分离,使得应用程序更加灵活。
- 提高可移植性:不同的应用程序在不同的环境下可能需要不同的配置信息,使用配置文件可以使得应用程序的配置信息更易于迁移,使得应用程序在不同的环境下都可以正常运行。
- 提高安全性:某些敏感的配置信息,如数据库连接字符串、密码等,不应该直接写在代码中,而是应该保存在安全的地方,使用配置文件可以将这些敏感信息保存在加密的配置文件中,提高了应用程序的安全性。
- 方便管理:使用配置文件可以使得应用程序的配置信息更易于管理,如通过配置文件可以很容易地对不同的配置信息进行分类、分组和排序,便于维护和管理。
可以使得应用程序更加灵活、可移植、安全和易于管理。
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
、@ConfigurationProperties
和 Environment
等方式读取配置文件。
(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),使得数据读写更加灵活和通用。