在条件Bean上使用@Value

时间:2019-05-17 15:42:07

标签: spring spring-boot spring-el java-11

我正在通过条件Bean提供值。如果满足条件,那么一切都很好,但是如果不满足条件(因此不存在bean),我的代码将失败。有没有什么方法可以检查bean是否事先定义。在SpEL中?

我尝试过类似 #{someBean? someBean.myValue:null},但无效。

1 个答案:

答案 0 :(得分:1)

请参阅this answer,了解其工作原理...

@SpringBootApplication
public class So56189689Application {

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

    @Value("#{containsObject('foo') ? getObject('foo').foo : null}")
    String foo;

    @Bean
    public ApplicationRunner runner() {
        return args -> System.out.println(foo);
    }

//  @Bean
//  public Foo foo() {
//      return new Foo();
//  }

    public static class Foo {

        private String foo = "bar";

        public String getFoo() {
            return this.foo;
        }

        public void setFoo(String foo) {
            this.foo = foo;
        }

    }

}

编辑

SpEL表达式的#root对象是BeanExpressionContext,您可以在该上下文上调用containsObject()getObject()方法。

这是BeanExpressionContext中的代码:

public boolean containsObject(String key) {
    return (this.beanFactory.containsBean(key) ||
            (this.scope != null && this.scope.resolveContextualObject(key) != null));
}


public Object getObject(String key) {
    if (this.beanFactory.containsBean(key)) {
        return this.beanFactory.getBean(key);
    }
    else if (this.scope != null){
        return this.scope.resolveContextualObject(key);
    }
    else {
        return null;
    }
}