手动获取配置文件中的信息的几种方式
问题描述:在static方法里获取properties或者yml文件中无法通过@Vlaue获取配置文件中的信息,因为static的加载的时候,属性还没注入成功,所以获取的结果是null
方式一:适用于启动Springboot时获取的场景
java@SpringBootApplication(scanBasePackages = "com.ci") public class ApiApplication { public static void main(String[] args) { // 启动Spring应用 ConfigurableApplicationContext context = SpringApplication.run(ApiApplication.class, args); // 获取Environment对象读取配置 Environment env = context.getEnvironment(); String serverPort = env.getProperty("server.port"); String databaseUrl = env.getProperty("spring.datasource.url"); System.out.println("Server Port: " + serverPort); System.out.println("Database URL: " + databaseUrl); // 关闭应用上下文(可选) context.close(); } }方式二:适用于仅读取配置而不启动Spring的场景
添加依赖
xml<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.30</version> </dependency>读取配置文件
javaimport org.yaml.snakeyaml.Yaml; import java.io.InputStream; import java.util.Map; public class ConfigReader { public static void main(String[] args) { Yaml yaml = new Yaml(); try (InputStream inputStream = ConfigReader.class.getClassLoader() .getResourceAsStream("application.yml")) { // 加载YAML为Map结构 Map<String, Object> config = yaml.load(inputStream); // 读取嵌套属性(示例:spring.datasource.url) Map<String, Object> springConfig = (Map<String, Object>) config.get("spring"); Map<String, Object> datasourceConfig = (Map<String, Object>) springConfig.get("datasource"); String databaseUrl = (String) datasourceConfig.get("url"); System.out.println("Database URL: " + databaseUrl); } catch (Exception e) { e.printStackTrace(); } } }
方式三:若需在静态方法中多次访问配置,可在启动后保存Environment
java@SpringBootApplication(scanBasePackages = "com.ci") public class ApiApplication { private static Environment env; public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(ApiApplication.class, args); env = context.getEnvironment(); // 示例:在其他静态方法中使用 printConfig(); context.close(); } public static void printConfig() { String port = env.getProperty("server.port"); System.out.println("Static Access - Port: " + port); } }