从另一个类的静态方法初始化Spring bean?

我试图创buildHibernate Validator bean,并遇到这个问题,从另一个类的静态工厂方法创build一个bean。 我发现Spring方法让我的Validator bean初始化(解决scheme在底部),但问题本身仍然没有解决。 此处使用Validator作为示例。

这是我如何在Java中创buildValidator实例

import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); 

这是我尝试在applicationContext.xml中创buildbean的方式

 <bean id="validatorFactory" class="javax.validation.ValidatorFactory" factory-method="javax.validation.Validation.buildDefaultValidatorFactory" /> <bean id="validator" class="javax.validation.Validator" factory-bean="validatorFactory" factory-method="getValidator" /> 

我所理解的是,在“工厂方法”中,只能访问在“class”参数中定义的类中定义的静态方法。 由于方法buildDefaultValidatorFactory()是静态的,我不能创build一个Validation的实例,并将其作为validatorFactory的“factory-bean”,如下所示:

 <bean id="validation" class="javax.validation.Validation" /> <bean id="validatorFactory" class="javax.validation.ValidatorFactory" factory-bean="validation" factory-method="buildDefaultValidatorFactory" /> 

这结束了错误消息

“检查具有指定名称的方法是否存在并且是非静态的

问题是你如何在Spring的这种情况下创buildbean?

这就是我解决Validator问题的方法:

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

factory-method应该只包含方法名称,不包括类名称。

如果你想使用一个静态工厂,把工厂的class (!)给予bean声明,如果你想使用一个实例工厂,给factory-bean的bean声明,但不要同时提供:创build的bean的类没有在bean声明中给出。

所以一个完整的例子应该像这样,使用validatorFactory的静态工厂和validatorFactory的实例工厂:

 <bean id="validatorFactory" class="javax.validation.Validation" factory-method="buildDefaultValidatorFactory" /> <bean id="validator" factory-bean="validatorFactory" factory-method="getValidator" /> 

查看文档的详细信息:

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class-static-factory-method

回答你的问题 – 在这种情况下,你将如何创buildbean? – 完全按照此处显示的内容进行操作,或者如果可以,请使用像LocalValidatorFactoryBean这样的实用程序类,它简化了Springconfiguration。

你试过这个吗?

 <bean id="validatorFactory" class="javax.validation.Validation" factory-method="buildDefaultValidatorFactory" /> <bean id="validator" class="javax.validation.Validator" factory-bean="validatorFactory" factory-method="getValidator" />