我想在我的代码中捕获bean实例化异常。我有什么选择? 一种方法是使用基于Java的容器配置:
@Configuration
public class AppConfig {
@Bean
public SomeBean someBean() {
try {
return new SomeBean(); // throws SomeException
} catch(SomeException se) {
return new SomeBeanStub();
}
}
}
是否可以使用基于XML或基于注释的配置使用Spring定义bean实例化的异常处理程序?
答案 0 :(得分:11)
方法someBean
应该抓住SomeException
,然后以SomeException
作为原因抛出BeanCreationException
:
@Configuration
public class AppConfig {
@Bean
public SomeBean someBean() {
try {
return new SomeBean(); // throws SomeException
} catch (SomeException se) {
throw new BeanCreationException("someBean", "Failed to create a SomeBean", se);
}
}
}
答案 1 :(得分:2)
你不应该这样做。这就是让Spring为你创建一个bean的重点。如果要使用new
创建自己的bean(如上所述),为什么要使用Spring为您创建bean?
您确实可以为自己分配对象并继续工作,而不是依赖注入和所有。
虽然我理解问题背后的本质。我认为最好是在服务器加载期间失败。原因:应用程序不会处于不一致状态。假设您捕获异常并执行一些清洁,但其他类将期望该bean存在而不存在。
因此最好在初始化时失败,以便应用程序保持一致。虽然我不知道其他任何合法的做法。
答案 2 :(得分:2)
只是为了完整。
你也可以懒惰初始化bean并在第一次使用bean时捕获异常。
spring config:
<bean id="a" class="A" lazy-init="true" />
在java中:
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
public class B {
@Autowired
@Lazy
A a;
public void foo(){
try{
a.foo();
} catch (BeanCreationException e){
// ignore if you want
}
}
}
答案 3 :(得分:0)
如果您希望在bean创建期间出现故障并且bean对于应用程序的其余部分(非常合理的情况)不是强制性的,您可以按照建议通过捕获@Bean方法体中的所有失败异常并返回{ {1}}表示bean创建失败。 在这种情况下,bean不会被添加到Spring应用程序上下文中,如果给定bean没有强制依赖,则上下文构造将成功。