8

例如,我有一堂课

public class Car{
     private Motor motor;

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

我的豆子看起来像

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

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

但是可能存在未创建此类 bean(具有此类名称)的情况。我怎样才能检查它?

4

2 回答 2

19

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

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()),因此捕获异常通常更快。

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

于 2013-02-06T08:25:58.880 回答
3

SPEL; 就像是:

<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

于 2013-02-06T07:51:07.100 回答