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已经准备好,方法调用也可以工作
所以:
- 我的分析正确吗李>
- 为什么会这样?我认为依赖注入系统应该检测
MethodInvokingFactoryBean
和freemarkerConfiguration
之间的依赖,并在工厂bean准备好后调用方法。我试图在MethodInvokingFactoryBean
上添加depends-on="freemarkerConfiguration"
,但没有效果李>- 有没有一种方法可以在XML中实现我想要的东西(我现在不能切换到Java
@Configuration
)。基本上,我需要一种从XML调用freemarker.core.Configurable.setArithmeticEngine()
的方法李> - 有没有一种方法可以在XML中实现我想要的东西(我现在不能切换到Java
谢谢
共 (0) 个答案