[英]Spring - catch bean creation exception
我想在我的代码中捕获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实例化定义异常处理程序?
方法someBean
应该抓住SomeException
再扔BeanCreationException
与SomeException
的原因:
@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);
}
}
}
你不应该这样做。 这就是让Spring为你创建一个bean的重点。 如果你要使用new
创建自己的bean(如上所述),为什么要使用Spring为你创建bean?
您确实可以为自己分配对象并继续工作,而不是依赖注入和所有。
虽然我理解这个问题背后的本质。 我认为最好是在服务器加载期间失败。 原因:应用程序不会处于不一致状态。 假设您捕获异常并执行一些清洁,但其他类将期望该bean存在而不存在。
因此最好在初始化时失败,以便应用程序保持一致。 虽然我不知道其他任何合法的做法。
只是为了完整。
你也可以懒惰初始化bean并在第一次使用bean时捕获异常。
弹簧配置:
<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
}
}
}
如果您期望在bean创建期间出现故障并且bean对于应用程序的其余部分(非常合理的情况)不是必需的,您可以按照建议通过捕获@Bean方法体中的所有失败异常并返回null
来指示bean创建失败了。 在这种情况下,bean不会被添加到Spring应用程序上下文中,如果给定bean没有强制依赖,则上下文构造将成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.