如何理解bean是否存在于运行时?

时间:2013-02-06 07:47:07

标签: java spring javabeans

例如,我有一个班级

public class Car{
     private Motor motor;

     public void setMotor(Motor motor){
          this.motor = motor;
     }   
}

我的bean看起来像

<bean id="car" class="Car">
    <property name="motor" ref="${motorProvider.getAvailableMotor()}"/>
</bean>

此方法:motorProvider.getAvailableMotor()返回一个bean名称(字符串),我应该使用哪个电机。

但是可能存在没有创建这样的bean(具有这样的名称)的情况。我怎么检查呢?

2 个答案:

答案 0 :(得分:13)

有几种模式如何做到这一点。这是我经常使用的一个:

public class Car{
     private Motor motor;

     @Autowired
     private ApplicationContext applicationContext;

     @PostConstruct
     public void init() {
        try {
            motor = applicationContext.getBean( Motor.class );
        } catch( NoSuchBeanDefinitionException e ) {
            motor = new DefaultMotor();
        }
     }
}

请注意,您也可以调用applicationContext.containsBeanDefinition(name),但这会搜索您的上下文两次(一次在containsBeanDefinition(),然后第二次调用getBean()),因此捕获异常通常会更快。< / p>

由于我们捕获了一个说“bean不存在”的特定异常,因此使用if / else几乎没有任何优势。

答案 1 :(得分:2)

SpeI位;类似的东西:

<property name="motor" value="#(if(${motorProvider} != null) ${motorProvider.getAvailableMotor()})"/>

我认为这里也讨论过:Spring - set a property only if the value is not null。如前所述,欲了解更多信息,请参阅:http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html