我正在为我在Kotlin上编写的应用程序使用Spring Boot。我可以使用Environment.getProperty("nonOptionArgs", Array<String>::class.java)
但是,在BeanFactoryPostProcessor
内部,我无法自动连接环境-因为此后处理器在生命周期中运行得太早。如何访问BeanFactoryPostProcessor
内部的命令行参数?
答案 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)