问题: 尝试从 AWS Secrets Manager 加载可用于各种 Spring Boot 自动配置值(数据源、Kafka 等)的配置值。
我提出的解决方案: 编写一个可重用的组件,从 AWS Secrets Manager 获取值并在初始化期间设置环境变量。
解决方案的问题:在尝试实施上述解决方案时,数据源和其他资源的自动配置尝试在我设置环境变量之前发生,因此应用程序无法启动。我需要预先运行我的配置。
注意:我不想使用spring-cloud
解决方案,因为对我来说,我试图解决的一个简单问题过于复杂,我希望对我使用的模式进行更多控制。最重要的是,我也无法让它发挥作用。
尝试过的解决方案(所有这些在应用程序初始化后仍然运行):
@Configuration
@Order(0)
public class CredentialConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(CredentialConfiguration.class);
public CredentialConfiguration() {
// code to fetch and set environment variables
}
}
@Component
public class CredentialConfiguration implements ApplicationRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(CredentialConfiguration.class);
@Override
public void run(ApplicationArguments args) throws Exception {
// code to fetch and set environment variables
}
}
@Component
public class CredentialConfiguration implements ApplicationListener<ApplicationEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(CredentialConfiguration.class);
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
// code to fetch and set environment variables
}
}
到目前为止,我能找到的唯一解决方案是在应用程序运行之前初始化变量:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SecretsLoader.loadSecrets("my-secret-name"); // here
SpringApplication.run(Application.class, args);
}
}
但是,我不喜欢这种方法,因为必须对“我的秘密名称”进行硬编码或以编程方式从 Spring API 之外的属性文件中获取。我想要一些与 Spring 集成的方法,并确保在尝试初始化任何其他 bean 之前设置这些变量。任何指针将不胜感激!