【问题标题】:How can I understand whether a bean exists in runtime?如何了解运行时是否存在 bean?
【发布时间】:2013-01-21 08:25:26
【问题描述】:

例如,我有一个班级

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(具有这样的名称)的情况。如何查看?

【问题讨论】:

  • 知道 bean 是否在上下文中有什么意义?当它不存在时,你能做一些有用的事情吗?
  • @AaronDigulla 如果它不存在,那么我将设置一些默认值。

标签: java spring javabeans


【解决方案1】:

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

【讨论】:

  • 我想,你不明白我的意思)我不想检查 null 的东西,我想了解在我的上下文中是否有这样的 bean。因为如果没有创建这样的bean,spring会引发异常
【解决方案2】:

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

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 几乎没有优势了。

【讨论】:

  • 看起来很有趣,我试试看
  • 我建议使用它而不是通过抛出异常来验证 if(appContext.containsBeanDefinition(w.getName()));
  • @Sridhar 比我必须在上下文中搜索两次 bean。这比处理异常更昂贵(上下文越大)。
  • @aaron 在这种情况下你可以尝试使用 containsBeanDefinition
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
相关资源
最近更新 更多