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

Mar*_*llo 7 java spring javabeans

例如,我有一个班级

public class Car{
     private Motor motor;

     public void setMotor(Motor motor){
          this.motor = motor;
     }   
}
Run Code Online (Sandbox Code Playgroud)

我的豆子看起来像

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

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

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

Aar*_*lla 16

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

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();
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我建议使用它,而不是通过抛出异常来进行验证 if(appContext.containsBeanDefinition(w.getName())); (2认同)