繁体   English   中英

Spring 应用程序启动时的引导注册bean

[英]Spring boot register bean when application is started

在 Spring 启动应用程序启动之前,我需要请求一些凭据。 我将它们存储在 object 中。

有没有办法在所有其他 bean 之前将此 object 注册为 bean,以便我可以将它们注入配置 class?

我试过如下但它抛出异常:

SpringBootApplication(exclude = {MongoAutoConfiguration.class, 
SecurityAutoConfiguration.class, DataSourceAutoConfiguration.class})
public class BeanOnInitApplication {

    public static void main(String[] args) {

        System.out.println("Starting the app");

        MongoCredentials creds = makeARequestToExternalServiceAndGetCredentials();
    
    
        GenericApplicationContext appContext = (GenericApplicationContext) SpringApplication.run(BeanOnInitApplication.class, args);
        appContext.registerBean("mongoCredentials", MongoCredentials.class, () -> creds, bdc -> bdc.setLazyInit(false));
    }

}

和配置 class:

@Configuration
public class AppConfig {

    @Autowired
    MongoCredentials mongoCredentials;

    @Bean(name = "mongoTemplate")
    public MongoTemplate mt() {
        String url = "mongodb://" + mongoCredentials.getUsername() + ":" + mongoCredentials.getPassword() + "@localhost:27017/admin";
        MongoDatabaseFactory mdf = new SimpleMongoClientDatabaseFactory(url);
        return new MongoTemplate(mdf);
    }
 }

如果这不是解决方案,还有哪些替代方案? scope 是先注册一个关键bean。

只需将其@Bean

@Bean
public MongoCredentials mongoCredentials() {
  return makeARequestToExternalServiceAndGetCredentials();
}

不要在makeARequestToExternalServiceAndGetCredentials中处理异常,让它们冒泡。 如果请求随后失败,应用程序将无法启动。 如果你想重试使用 Spring Retry RetryTemplate包装呼叫,你拥有你想要的一切。

另一种选择是,当您似乎正在使用 Spring Boot 时,它将允许对 Mongo 使用自动配置。 是创建一个EnvironmentPostProcessor ,它加载属性并将它们添加到环境中。

public class MongoCredentialsPostProcessor implements EnvironmentPostProcessor {
 public     void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
  MongoCredentials credentials = makeARequestToExternalServiceAndGetCredentials();
  String url = "mongodb://" + mongoCredentials.getUsername() + ":" + mongoCredentials.getPassword() + "@localhost:27017/admin";

  Map<String, Object> props = Map.of("spring.data.mongodb.uri", url);
  MapPropertySource mps = new MapPropertySource("mongo-credentials", props):
}
}

最后,您还可以修改当前代码以执行与EnvironmentPostProcessor相同的操作。

SpringBootApplication(exclude = {
SecurityAutoConfiguration.class, DataSourceAutoConfiguration.class})
public class BeanOnInitApplication {

    public static void main(String[] args) {

        System.out.println("Starting the app");

        MongoCredentials creds = makeARequestToExternalServiceAndGetCredentials();
      String url = "mongodb://" + mongoCredentials.getUsername() + ":" + mongoCredentials.getPassword() + "@localhost:27017/admin";
        
        SpringApplicationBuilder sab = new SpringApplicationBuilder(BeanOnInitApplication.class);
         sab.properties(Map.of("spring.data.mongodb.uri", url)).run(args);
    }
}

对于后者和EnvironmentPostProcessor ,您应该能够使用 mongo 自动配置(它将为您提供MongoTemplate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM