有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring 4:在FactoryBean实例上调用FactoryBean的方法

我试图在Spring 4中使用org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean创建一个FreeMarker配置,然后定制生成的freemarker.template.Configuration(以更改算术引擎)

我正在使用以下XML配置(简化):

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
  <property name="templateLoaderPaths">...</property>
   ...
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="freemarkerConfiguration" />
    <property name="targetMethod" value="setArithmeticEngine" />
    <property name="arguments" value="#{T(freemarker.core.ArithmeticEngine).CONSERVATIVE_ENGINE}" />
</bean>

它可以工作,但在应用程序启动期间,我收到了很多警告:

2015-02-27 13:53:03,321 [localhost-startStop-1] [:] WARN  support.DefaultListableBeanFactory - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.beans.factory.config.MethodInvokingFactoryBean#0' defined in ServletContext resource [/WEB-INF/spring/freemarker.xml]: Cannot resolve reference to bean 'freemarkerConfiguration' while setting bean property 'targetObject'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'freemarkerConfiguration': FactoryBean which is currently in creation returned null from getObject

我的理解是,之所以会发生这种情况,是因为FreeMarkerConfigurationFactoryBean实现了^{}接口。因此,这个FactoryBean首先是“准备好的”,然后只要需要访问它创建的实际bean(freemarker.template.Configuration),就调用FactoryBean.getObject()

似乎在底层bean仍由FreeMarkerConfigurationFactoryBean“准备”时MethodInvokingFactoryBean被调用,导致FreeMarkerConfigurationFactoryBean.getObject()返回null,方法调用失败

我怀疑我收到了很多警告,因为Spring反复尝试调用该方法,但失败了。在某个时刻,工厂生产的bean已经准备好,方法调用也可以工作

所以:

  • 我的分析正确吗
  • 为什么会这样?我认为依赖注入系统应该检测MethodInvokingFactoryBeanfreemarkerConfiguration之间的依赖,并在工厂bean准备好后调用方法。我试图在MethodInvokingFactoryBean上添加depends-on="freemarkerConfiguration",但没有效果
  • 有没有一种方法可以在XML中实现我想要的东西(我现在不能切换到Java @Configuration)。基本上,我需要一种从XML调用freemarker.core.Configurable.setArithmeticEngine()的方法

谢谢


共 (0) 个答案