当前位置: 首页 > 面试题库 >

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

师赤岩
2023-03-14
问题内容

我试图创建Hibernate Validator bean,并遇到从另一个类中的静态工厂方法创建bean的问题。我找到了一种初始化我的Validator
bean的Spring方法(底部是解决方案),但是问题本身仍然没有解决。验证器在此处用作示例案例。

这就是我用Java创建Validator实例的方式

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

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

这就是我尝试在applicationContext.xml中创建bean的方式

<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”参数中定义的Class中定义的静态方法。由于方法buildDefaultValidatorFactory()是静态的,因此无法创建Validation的实例,并将其作为ValidatorFactory的“
factory-bean”提供,如下所示:

<bean id="validation" class="javax.validation.Validation" />

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

这最终导致错误消息

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

问题是在春季这种情况下您将如何创建bean?

这是我解决验证程序问题的方法:

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

问题答案:

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

如果要使用静态工厂,class则将factory(!)的值提供给bean声明,如果要使用实例工厂,将的值提供factory- bean给bean声明,但不要同时提供两者: bean声明中未提供bean。

因此,一个完整的示例应该看起来像这样,对它使用静态工厂,对它使用validatorFactory实例工厂validator

<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

要回答您的问题- 在春季的这种情况下,您将如何创建bean?
-完全按照此处显示的方法进行操作,或者,如果可以的话,使用实用程序类(如LocalValidatorFactoryBean)来简化Spring配置。



 类似资料:
  • 我创建了两个类:和。下面是进行计算的方法: 这里是一个调用并显示结果的函数,不幸的是,我无法根据这本书要求它运行的方式来运行它。 任何提示都会帮助我在我的再教育过程中。

  • 问题内容: 我最近从使用PHP切换到Java,并进行了查询。想强调一下我是Java的初学者。 本质上,我正在使用文件A(具有类A),并且想要引用保存在文件B(类B)中的静态方法。使用A类时是否需要参考文件B?(我正在考虑使用PHP中的require_once)我在A类中的代码如下: Eclipse无法将B识别为类。我是否需要创建B的实例才能访问静态方法。觉得我真的忽略了某些东西,希望您能提出任何建

  • 我想在另一个类中使用那个擦除方法,但由于它看起来不是静态的,所以我不能这样做 那么我如何访问那个方法呢?

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 我正在开发我的第一个 Swing 应用程序,现在提出了一个难题:在静态初始化期间或开始实际执行后执行引导和资源初始化。我是什么意思...我有单例: 因此,方法如下所示 或者,也许我在启动后手动初始化资源,然后运行它。逻辑上正确的方式是什么?

  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清