【问题标题】:How to get command line argument inside BeanFactoryPostProcessor?如何在 BeanFactoryPostProcessor 中获取命令行参数?
【发布时间】:2019-06-09 14:49:07
【问题描述】:

我正在为我在 Kotlin 上编写的应用程序使用 Spring Boot。我可以使用 Environment.getProperty("nonOptionArgs", Array<String>::class.java)

获取命令行参数

但是,在BeanFactoryPostProcessor 内部,我无法自动装配环境——因为这个后处理器在生命周期中运行得太早了。如何访问BeanFactoryPostProcessor 中的命令行参数?

【问题讨论】:

  • @Lino 你是对的 - 这是 Kotlin :)
  • 尝试自动装配org.springframework.boot.ApplicationArguments,然后调用它的方法getSourceArgs。看看这是否有效。
  • @VHS 不起作用 - 当 BeanFactoryPostProcessor 运行时 - 上下文中根本没有 bean - 只有 bean 定义。
  • 如果根据您的命令行参数有谨慎数量的案例,您可以尝试使用ConditionalOnProperty
  • @OleksandrPapchenko 在有条件地加载 bean 方面(如 Spring Boot 中的自动配置),我想说使用 @ConditionalXXX 注释要干净得多

标签: spring spring-boot kotlin


【解决方案1】:

好吧,您可以使用EnvironmentAware 实现您的BeanFactoryPostProcessor 以获得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;
    }

}

【讨论】:

  • 哇,谢谢,这确实有效!这真太了不起了。据我了解,在上下文中仍然没有定义 Environment bean - 在 BeanFactoryPostProcessor 时根本没有 bean - 但是,spring 真的在生命周期的早期创建 Environment ?
  • 是的,它在创建上下文时在构造函数中创建Environment。我的猜测是它会首先创建Environment,但后来将此实例注册为一个bean。所以从技术上讲,设置为BeanFactoryPostProcessorEnvironment仍然不是一个spring bean,但它最终会是一个spring bean..我的猜...
【解决方案2】:

来自您的评论:

我想根据命令参数动态定义 bean 价值观。为什么我要在 BeanFactoryPostProcessor 中执行此操作 - 可以肯定 bean 定义在实际 bean 实例化之前就在那里 - 所以我 不需要@DependsOn 注释。

在有条件地加载 bean 方面(如 spring boot 中的自动配置),我会说使用 @ConditionalXXX 注释要干净得多,尤其是 @ConditionalOnProperty强>。

引用 @ConditionalOnProperty here 的 Java-doc 他们说:

条件检查指定的属性是否具有特定的 价值。默认情况下,属性必须存在于环境中 并且不等于假。 haveValue() 和 matchIfMissing() 属性允许进一步自定义。

所以你可以做类似的事情:

@ConditionalOnProperty(prefix = "my.env", name = "var", havingValue = "true", matchIfMissing = false)

【讨论】:

  • 感谢您的回复,但是,我想根据命令行参数定义动态数量的 bean。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2013-08-23
相关资源
最近更新 更多