Estoy usando Spring boot para mi aplicación escrita en Kotlin. Puedo obtener argumentos de línea de comando usando Environment.getProperty("nonOptionArgs", Array<String>::class.java)
Sin embargo, dentro BeanFactoryPostProcessor no puedo autoconectar el entorno, ya que este posprocesador se está ejecutando demasiado pronto en el ciclo de vida. ¿Cómo puedo acceder a los argumentos de la línea de comandos dentro de BeanFactoryPostProcessor ?
Bueno, puede implementar su BeanFactoryPostProcessor con EnvironmentAware para obtener el Environment :
@Component public class FooBeanFactoryPostProcessor implements BeanFactoryPostProcessor , EnvironmentAware{ private Environment env; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { env.getProperty("nonOptionArgs"); //I should be able to access env at here .Hehe } @Override public void setEnvironment(Environment environment) { this.env = environment; } }De tu comentario:
Me gustaría definir beans dinámicamente en función de los valores de los argumentos del comando. ¿Por qué hago esto en BeanFactoryPostProcessor? Es para asegurarme de que las definiciones de beans estén allí antes de la instanciación real de beans, por lo que no necesito la anotación @DependsOn.
En términos de cargar beans condicionalmente (como la configuración automática en Spring Boot), diría que es mucho más limpio usar las anotaciones @ConditionalXXX , más específicamente @ConditionalOnProperty .
Haciendo referencia al Java-doc para @ConditionalOnProperty aquí dijeron:
Condicional que comprueba si las propiedades especificadas tienen un valor específico. Por defecto, las propiedades deben estar presentes en el entorno y no ser iguales a false. Los atributos beingValue() y matchIfMissing() permiten más personalizaciones.
Entonces puedes hacer algo similar a:
@ConditionalOnProperty(prefix = "my.env", name = "var", havingValue = "true", matchIfMissing = false)