如何在BeanFactoryPostProcessor中获取命令行参数?

时间:2019-01-15 14:59:03

标签: spring spring-boot kotlin

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

获取命令行参数

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

2 个答案:

答案 0 :(得分:2)

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

}

答案 1 :(得分:1)

根据您的评论:

  

我想基于命令参数动态定义bean   价值观。为什么我要在BeanFactoryPostProcessor中执行此操作-请确保   在实际的bean实例化之前就已经有bean定义了,所以我   不需要@DependsOn注释。

在有条件地加载Bean方面(如春季启动中的自动配置),我想说使用 @ConditionalXXX 注释(最具体地是 @ConditionalOnProperty )要干净得多。 strong>。

他们参考了@ConditionalOnProperty here的Java文档:

  

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

因此,您可以执行类似的操作:

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