0

问题: 尝试从 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 之前设置这些变量。任何指针将不胜感激!

4

0 回答 0