通过Factory方法实例化Bean

时间:2012-03-15 12:32:16

标签: spring

我已经声明了一个通过工厂方法实例化的bean。工厂方法调用一些远程服务。因此,该方法已被声明为抛出异常。

当一切正常时,正确地实例化bean。但是,当工厂方法抛出异常时,一切都会出错。因为我声明的bean是从另一个bean引用的。

如果工厂方法抛出异常,我想设置一个默认值。

我的配置文件的一部分如下:

<bean id="Helper" class="com.test.Helper">
   <constructor-arg ref="myBean" />
</bean>
<bean id="myBean" class="com.test.Factory" factory-method="getBean" />

getBean()方法如下:

Factory {
      public static Bean getBean() throws Exception{
             //Invokes some Remote Services and does some processing
             ....
             ....
            //returns bean object
      }

  }

请帮我解决这个问题。我不允许修改工厂方法。

1 个答案:

答案 0 :(得分:3)

如果bean或factory方法在创建过程中抛出异常,则整个应用程序上下文启动失败(我想这就是“一切都开始出错”的意思)。在Spring方面你无能为力。

如果要返回某个默认值,只需捕获自定义工厂中的异常,记录它并返回该默认值。如果您无法修改现有工厂,请考虑@Configuration方法:

@Configuration
public SafeCfg {

    @org.springframework.context.annotation.Bean
    public Bean bean() {
        try {
            return Factory.getBean();
        } catch(Exception e) {
            return //some default Bean
        }
    }

}

它从Spring 3.0开始运行。只需将它放在某处,以便应用程序上下文可以将其拾起。

但我怀疑这是你想要的。即使外部系统可用,您仍将使用默认的回退值。你期望它能像这样工作吗?更高级的方法是使用延迟代理(Spring支持它:Is there a spring lazy proxy factory in Spring?)并仅在需要时初始化它并在破坏时刷新。