Как создать компоненты spring boot на основе параметра

#java #spring #spring-boot

#java #spring #spring-boot

Вопрос:

У меня есть пользовательская (не spring) обработка командной строки, и я хочу создать некоторые компоненты spring, настроенные с использованием этих вычисленных параметров

 fun main(args: Array<String>) {
        val computed = processArgs(args)
        if (computed.xxx()) {
           runApplication<Main>(*args) // run spring app
        } else {
          do_something_without_spring(computed)
        }
}
  

и затем я хочу иметь фабрику компонентов, которая зависит от computed

 @Configuration
class Config {
 
   @Bean
   fun createBean() {
      if (computed.xyz()) ...  // how to pass `computed` here? 
   }
}
  

как я должен это передать? просто закодируйте его как строку и добавьте в аргументы? как получить к нему доступ позже в фабричном методе? или есть какой-нибудь способ внедрить компонент в контекст spring?

Комментарии:

1. docs.spring.io/spring-boot/docs/current/reference/html/… Я считаю, что это то, что вам нужно

Ответ №1:

Вы можете автоматически ApplicationArguments подключать компонент для чтения аргументов приложения, которые были переданы SpringApplication.run(…​)

Смотрите: https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-application-arguments

Пример:

 @SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@Configuration
class C {
    @Bean
    B b(ApplicationArguments args) {
        System.out.println(String.join("", args.getSourceArgs()));
        return new B();
    }
}
class B { }