
[英]Register Bean Validation ValueExtractor with Spring/Spring Boot
[英]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.