Java 如何理解运行时中是否存在bean?
例如,我有一门课Java 如何理解运行时中是否存在bean?,java,spring,javabeans,Java,Spring,Javabeans,例如,我有一门课 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()
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(具有这样的名称)没有创建时,可能会出现这种情况。如何检查它?SPeL;比如:
<property name="motor" value="#(if(${motorProvider} != null) ${motorProvider.getAvailableMotor()})"/>
我想这里也讨论过。如他们之前所说,有关更多信息,请参阅:有几种模式可供选择。下面是我经常使用的一个:
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
几乎不再具有优势。试试看:知道bean是否在上下文中有什么意义?当它不存在时,你能做一些有用的事情吗?@Aarondigula如果它不存在,那么我会设置一些默认值。我想,你不理解我的意思)我不想检查空值,我想知道我的上下文中是否有这样的bean。因为如果没有创建这样的bean,spring将导致异常。它看起来很有趣,我将尝试使用它,而不是通过抛出异常(appContext.containsBeanDefinition(w.getName()))进行验证@Sridhar比我必须在上下文中搜索两次bean。这比处理异常更昂贵(上下文越大)。@aaron在这种情况下,您可以尝试使用containsBeanDefinition