场景
我在通用jar包中引入 spring-boot-starter-actuator 这样希望引用通用jar的所有服务都可以直接使用 actuator 中的功能,
问题在于,正常情况下,actuator的配置都写在每个项目的yml文件中,这就意味着,虽然每个项目都有了该jar,但是配置还是得单独写,
于是考虑能不能在common jar中直接写这个配置,其他服务都避免做出改动,思路方向就是想着在spring服务启动前,
能不能通过一种方式将我们的配置注入到spring的配置中,类似在application.yml中拦截添加一下,
通过 EnvironmentPostProcessor 可以帮我们实现这个功能。
实现
第一步,定义好yml文件。
management:
endpoints:
web:
exposure:
include:
- info
- health
- loggers #默认只暴露 /health 以及 /info 端点
第二步,自定义 PostProcessort 实现 EnvironmentPostProcessor,在这里,我们读取自定义的配置文件,并添加到 environment 中。
public class ActuatorPropertiesPostProcessor implements EnvironmentPostProcessor {
@SneakyThrows
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
PropertySource propertySource = new YamlPropertySourceLoader().load("actuator.yml"
, new FileUrlResource(ActuatorPropertiesPostProcessor.class.getResource("/Actuator.yml"))).get(0);
environment.getPropertySources().addLast(propertySource);
}
}
第三步,定义好 spring.factories,内容指向你刚写好的类。
org.springframework.boot.env.EnvironmentPostProcessor=you.package.name.ActuatorPropertiesPostProcessor
大功告成,这样你的所有引用common jar的服务就都可以使用actuator功能了。