java类中可用静态代码块在类加载时一次性读取并初始化外部配置,如数据库参数、应用常量等;需确保配置文件在classpath下,用properties加载并处理异常,但不支持热更新且类加载失败会抛exceptionininitializererror。

Java 类中可以用静态代码块(static block)在类加载时自动读取并初始化外部配置,适合一次性加载、全局共享的配置信息,比如数据库连接参数、应用常量等。
静态代码块加载配置的基本写法
静态代码块在类第一次被加载(如首次 new 实例、调用静态方法、访问静态字段)时执行,且只执行一次。可在此处读取 properties 文件、JSON 或 YAML(需配合第三方库),并赋值给 static 字段。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 确保配置文件放在 classpath 下(如 src/main/resources/config.properties)
- 使用 InputStream + Properties 加载标准 .properties 文件
- 捕获并处理 IOException 和 RuntimeException(如配置缺失字段)
示例:用 static 块加载 config.properties
假设 resources 下有 config.properties:
app.name=MyApp db.url=jdbc:h2:mem:test db.timeout=30
对应 Java 类:
public class AppConfig {
public static final String APP_NAME;
public static final String DB_URL;
public static final int DB_TIMEOUT;
static {
Properties props = new Properties();
try (InputStream is = AppConfig.class.getClassLoader()
.getResourceAsStream("config.properties")) {
if (is == null) {
throw new RuntimeException("config.properties not found in classpath");
}
props.load(is);
APP_NAME = props.getProperty("app.name", "Unknown");
DB_URL = props.getProperty("db.url");
DB_TIMEOUT = Integer.parseInt(props.getProperty("db.timeout", "10"));
} catch (IOException e) {
throw new RuntimeException("Failed to load config.properties", e);
} catch (NumberFormatException e) {
throw new RuntimeException("Invalid number in config: db.timeout", e);
}
}
}
注意事项与常见问题
- 类加载时机不可控:若配置文件路径错误或内容异常,会导致类加载失败,抛出 ExceptionInInitializerError,影响整个类使用
- 不支持热更新:静态块只运行一次,修改配置后必须重启应用
- 避免复杂逻辑:静态块里不宜做网络请求、数据库连接等耗时/易失败操作;应聚焦于解析和赋值
- 多线程安全:JVM 保证静态块在类初始化阶段单线程执行,无需额外同步
进阶建议:替代或增强方案
- 需要动态刷新?改用 Spring 的 @ConfigurationProperties + @RefreshScope
- 想统一管理多种格式?引入 Apache Commons Configuration 2 或 Lightbend Config
- 微服务场景?考虑从 Nacos、Apollo 等配置中心拉取,通过监听器更新本地 static 变量(需加锁或用 AtomicReference)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










