如何判断在运行时是否存在一个bean?

9
例如,我有一个类。
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。我该如何检查呢?

尝试一下:https://code.google.com/p/openpojo/ - Azodious
知道bean是否在上下文中有什么意义?当它不存在时,你能做些有用的事情吗? - Aaron Digulla
@AaronDigulla 如果它不存在,那么我会设置一些默认值。 - Mary Ryllo
2个回答

24

有几种方法可以做到这一点。这里是我经常使用的一种:

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


看起来很有趣,我会试一下。 - Mary Ryllo
2
我建议使用这种方式而不是通过抛出异常进行验证: if(appContext.containsBeanDefinition(w.getName())); - rolling stone
@Sridhar,那我必须为bean搜索两次上下文。这比处理异常更昂贵(上下文越大)。 - Aaron Digulla
@aaron 在这种情况下,你可以尝试使用 containsBeanDefinition。 - rolling stone

3

1
我觉得你没有理解我的意思。我不想检查 null,我想知道在我的上下文中是否有这样的 bean。因为如果这样的 bean 没有被创建,Spring 将会引发异常。 - Mary Ryllo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接