如何在Java应用全局调用config.properties中的hostName变量?
问题描述
我在RFIDMainDlg.java的main方法中加载了config.properties文件中的变量,代码如下。现在需要在RFIDBase.java等多个类中调用其中的hostName变量,请问该如何实现?
代码示例:
public static void main(String args[]) throws IOException { Properties prop=new Properties(); FileInputStream ip= new FileInputStream("resources/config.properties"); prop.load(ip); String hostName = prop.getProperty("hostName"); System.out.println(hostName); }
解决方案
下面是几种实用的实现方式,可根据项目规模选择:
方式1:创建单例配置类(推荐)
专门做一个配置管理类,程序启动时加载配置,其他类通过单例实例获取配置项,避免重复加载和全局变量混乱。
import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class ConfigManager { // 单例实例,双重校验锁保证线程安全 private static volatile ConfigManager instance; private Properties properties; // 私有构造,禁止外部实例化 private ConfigManager() { properties = new Properties(); try { FileInputStream ip = new FileInputStream("resources/config.properties"); properties.load(ip); } catch (IOException e) { // 根据需求处理异常,比如抛运行时异常或打日志 throw new RuntimeException("加载配置文件失败", e); } } // 获取单例实例 public static ConfigManager getInstance() { if (instance == null) { synchronized (ConfigManager.class) { if (instance == null) { instance = new ConfigManager(); } } } return instance; } // 对外提供获取hostName的方法 public String getHostName() { return properties.getProperty("hostName"); } // 若有其他配置项,可添加类似方法 // public String getPort() { // return properties.getProperty("port"); // } }
在RFIDBase.java中调用:
String hostName = ConfigManager.getInstance().getHostName();
方式2:用静态变量存储配置
在RFIDMainDlg中定义静态变量,加载配置后赋值,其他类直接访问该静态变量,适合小型简单项目。
修改RFIDMainDlg.java:
public class RFIDMainDlg { // 定义静态变量存储hostName public static String hostName; public static void main(String args[]) throws IOException { Properties prop=new Properties(); FileInputStream ip= new FileInputStream("resources/config.properties"); prop.load(ip); hostName = prop.getProperty("hostName"); System.out.println(hostName); } }
在RFIDBase.java中调用:
String hostName = RFIDMainDlg.hostName;
注意:必须保证
main方法先执行,否则变量会为null,仅适用于程序入口就是该main的场景。
方式3:全局共享Properties实例
把加载好的Properties实例设为全局可访问,其他类直接从实例中获取配置项。
修改RFIDMainDlg.java:
public class RFIDMainDlg { public static Properties globalProps; public static void main(String args[]) throws IOException { globalProps = new Properties(); FileInputStream ip= new FileInputStream("resources/config.properties"); globalProps.load(ip); String hostName = globalProps.getProperty("hostName"); System.out.println(hostName); } }
在RFIDBase.java中调用:
String hostName = RFIDMainDlg.globalProps.getProperty("hostName");
这种方式可获取所有配置项,但直接暴露
Properties实例缺乏封装性,仅建议在简单场景使用。
内容的提问来源于stack exchange,提问作者Ryan Fitz
相关产品推荐
相关产品推荐

