package com.baiwang.fin.preprocess; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; /** * @author wangchaofan * @date 2025/3/19 15:45 **/ @Slf4j @SpringBootApplication @EnableAsync public class ZbApplication { public static void main(String[] args) { SpringApplication.run(ZbApplication.class, args); } } 项目启动之后打印加载的配置
时间: 2025-07-10 08:48:32 浏览: 15
<think>嗯,用户给了一个Java Spring Boot项目的启动类代码,问如何在项目启动后打印加载的配置。首先,我需要理解用户的需求。他们可能想要在应用启动时查看当前生效的配置,比如环境变量、application.properties中的配置等,用于调试或验证配置是否正确加载。
接下来,我需要回忆Spring Boot的相关知识。Spring Boot在启动时会加载各种配置,这些配置可能来自多个地方,比如默认配置、外部配置文件、环境变量、命令行参数等。要打印这些配置,通常可以通过访问Environment对象来实现,因为Environment接口负责管理应用的配置属性。
然后,考虑如何在启动类中获取Environment实例。Spring Boot应用启动时,SpringApplication.run()方法会返回ConfigurableApplicationContext,而通过这个上下文可以获取Environment对象。因此,可以在main方法中捕获这个上下文,然后从中取出Environment。
但是用户提供的代码中,main方法直接调用了SpringApplication.run(),没有保存返回的上下文。所以需要修改代码,将返回值赋给一个变量,比如ConfigurableApplicationContext context = SpringApplication.run(...);。
然后,通过context.getEnvironment()获取环境配置。之后需要遍历并打印这些配置。不过Environment对象中的配置可能分为不同的PropertySource,比如系统属性、环境变量、应用配置等,可能需要分别处理。
例如,可以获取所有来自application.properties或application.yml的配置,或者包括其他来源的配置。用户可能希望看到所有加载的配置,或者只关注特定前缀的配置,比如spring.datasource等。这时候可能需要进一步询问用户需求,但根据问题描述,用户可能希望打印所有配置。
打印配置时要注意敏感信息,比如密码、密钥等,不能直接输出到日志中。所以需要提醒用户注意过滤敏感信息,或者在打印时排除某些关键字。
另外,用户可能希望配置是在应用启动完成后打印,这时候可以考虑使用ApplicationRunner或CommandLineRunner接口,在run方法中执行打印逻辑。这样确保所有配置已经加载完毕。
不过,如果用户希望在启动后立即打印,可能直接在main方法中获取环境变量并打印。但需要注意,此时可能某些配置还未完全加载,特别是那些依赖于Profile的配置。因此,使用ApplicationRunner可能更安全,因为它会在应用完全启动后执行。
总结可能的步骤:修改启动类,实现ApplicationRunner接口,重写run方法,从Environment中获取所有属性,遍历并打印。同时,处理敏感信息,或者按需过滤属性。
然后,代码方面,需要注入Environment或者通过上下文获取。例如,在ZbApplication类中实现ApplicationRunner,并自动注入Environment。或者在run方法中通过上下文获取。
另外,用户使用了Lombok的@Slf4j注解,所以可以直接使用log.info()来输出日志。需要确保日志级别设置为INFO,否则可能看不到输出。
可能的代码示例:在ZbApplication类中添加@Bean方法,返回一个ApplicationRunner,或者在类上实现ApplicationRunner接口,并注入Environment。然后遍历propertySources,打印每个属性。
需要处理PropertySources的可能结构,每个PropertySource可能包含多个属性,例如SystemEnvironmentPropertySource、MapPropertySource等。遍历所有PropertySource,然后逐个输出其中的属性。
但需要注意的是,有些属性源可能包含不可序列化的属性,或者动态生成的属性,直接遍历可能会有问题。因此,更稳妥的方式是使用Environment的getProperty(key)方法,但需要先获取所有的属性键。不过Environment接口并没有直接提供获取所有属性键的方法,所以可能需要通过PropertySources来获取。
例如:
Environment env = context.getEnvironment();
for (PropertySource<?> propertySource : env.getPropertySources()) {
if (propertySource instanceof EnumerablePropertySource) {
EnumerablePropertySource<?> enumerable = (EnumerablePropertySource<?>) propertySource;
for (String key : enumerable.getPropertyNames()) {
log.info("{}={}", key, env.getProperty(key));
}
}
}
但这样可能会打印出很多系统属性、环境变量等,需要用户确认是否需要全部显示,或者只显示应用相关的配置。此外,敏感信息如密码需要处理。
最后,整合这些思路,给出代码示例,并提醒用户注意敏感信息,可能需要使用过滤机制,或者只打印特定前缀的属性。</think>根据代码结构,想要在Spring Boot项目启动后打印加载的配置,可以通过以下步骤实现:
```java
@Slf4j
@SpringBootApplication
@EnableAsync
public class ZbApplication implements ApplicationRunner { // 新增接口实现
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ZbApplication.class, args);
}
// 新增启动后执行的方法
@Override
public void run(ApplicationArguments args) {
printLoadedConfigs();
}
private void printLoadedConfigs() {
// 获取所有配置源
ConfigurableEnvironment env = (ConfigurableEnvironment) SpringApplication.run(ZbApplication.class).getEnvironment();
log.info("========== 加载的配置列表 ==========");
for (PropertySource<?> propertySource : env.getPropertySources()) {
if (propertySource instanceof MapPropertySource) {
MapPropertySource mapSource = (MapPropertySource) propertySource;
for (String propertyName : mapSource.getPropertyNames()) {
log.info("{}: {}", propertyName, mapSource.getProperty(propertyName));
}
}
}
log.info("==================================");
}
}
```
实现原理分步说明:
1. **实现ApplicationRunner接口**
- 该接口的`run()`方法会在应用启动完成后自动执行
- 比直接在`main()`方法中打印更安全,确保所有配置加载完成
2. **获取环境对象**
$$ ConfigurableEnvironment\ env\ =\ ... $$
- 通过`ConfigurableApplicationContext`获取环境对象
- `ConfigurableEnvironment`可以访问所有配置源
3. **遍历配置源**
- 每个`PropertySource`对应一个配置来源(如:application.properties、系统变量等)
- 使用`instanceof`筛选出`MapPropertySource`类型的配置源
4. **日志输出**
- 使用`log.info()`输出配置信息
- 通过Lombok的`@Slf4j`注解自动生成日志对象
**注意事项:**
1. 建议添加配置过滤逻辑,避免输出敏感信息(如密码)
2. 可通过`propertyName.startsWith("特定前缀")`过滤显示特定配置
3. 生产环境建议使用`DEBUG`级别输出,通过`log.debug()`配合日志级别控制
示例输出效果:
```
INFO com.baiwang.fin.preprocess.ZbApplication - ========== 加载的配置列表 ==========
INFO com.baiwang.fin.preprocess.ZbApplication - server.port: 8080
INFO com.baiwang.fin.preprocess.ZbApplication - spring.datasource.url: jdbc:mysql://localhost:3306/mydb
INFO com.baiwang.fin.preprocess.ZbApplication - spring.application.name: zb-service
INFO com.baiwang.fin.preprocess.ZbApplication - ==================================
```
阅读全文
相关推荐








