将 MethodInvokingFactoryBean 用于 XMLConfiguration 以在 Spring bean 中加载文件
Using MethodInvokingFactoryBean for XMLConfiguration to loading file in Spring bean
我有一个 xmlConfiguration bean 来加载 SystemProperty.xml 文件,如下所示
<bean
id="xmlConfiguration"
class="org.apache.commons.configuration.XMLConfiguration"
lazy-init="true">
<constructor-arg type="java.lang.String">
<value>SystemProperty.xml</value>
</constructor-arg>
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
</bean>
它工作正常,但是,我必须在 XMLConfiguration 中将 delimiterParsingDisabled 设置为 true,所以我更改了 bean 以添加 属性 delimiterParsingDisabled
<bean
id="xmlConfiguration"
class="org.apache.commons.configuration.XMLConfiguration"
lazy-init="true">
<constructor-arg type="java.lang.String">
<value>SystemProperty.xml</value>
</constructor-arg>
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
<property name="delimiterParsingDisabled">
<value type="java.lang.Boolean">true</value>
</property>
</bean>
但是,这不会很好地工作。由于 setDelimiterParsingDisabled()
必须在加载文件之前调用。因此,我必须在调用 setDelimiterParsingDisabled()
之后调用 XMLConfiguration 的 load(String fileName)
我已经使用 MethodInvokingFactoryBean
这种方式,但出现如下异常
org.apache.commons.configuration.ConfigurationException: No file name has been set!
at org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:409)
at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.save(AbstractHierarchicalFileConfiguration.java:214)
at devicemanage.system.SystemConfigurationServiceImpl.saveSystemProperty(SystemConfigurationServiceImpl.java:232)
at datacollection.service.DataCollectionServiceImpl.syncWithDataCollection(DataCollectionServiceImpl.java:786)
at devicemanage.utility.SyncWithDCListener.run(SyncWithDCListener.java:51)
似乎文件没有设置到XMLConfiguration中,我的MethodInvokingFactoryBean
描述如下
<bean id="xmlConfigurationMethodInvokingBean"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="xmlConfiguration" />
<property name="targetMethod" value="load" />
<property name="arguments" value="SystemProperty.xml" />
</bean>
当然,将我的 xmlConfiguration
bean 更改为在新建构造函数时不加载文件,如下所示
<bean
id="xmlConfiguration"
class="org.apache.commons.configuration.XMLConfiguration"
lazy-init="true">
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
<property name="delimiterParsingDisabled">
<value type="java.lang.Boolean">true</value>
</property>
</bean>
不确定是我使用 MethodInvokingFactoryBean
的方法不对,还是我在使用参数将文件名字符串传递到 load()
时出错
感谢任何帮助。
第一种方式
我建议您创建自己的继承 class 并声明 init-method
:
package beans;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
public class CustomXMLConfiguration extends XMLConfiguration {
private String loadFileName;
private void init() throws ConfigurationException {
this.load(fileName);
}
public String getLoadFileName() {
return loadFileName;
}
public void setLoadFileName(String fileName) {
this.loadFileName = fileName;
}
}
在配置中,您可以按以下方式使用此 class:
<bean id="xmlConfiguration" class="beans.CustomXMLConfiguration" lazy-init="true"
init-method="init">
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
<property name="delimiterParsingDisabled">
<value type="java.lang.Boolean">true</value>
</property>
<property name="loadFileName" value="SystemProperty.xml"/>
</bean>
init()
方法将在 bean 初始化后立即调用。
第二种方式
您可以使用 MethodInvokingBean
class 的 bean。这个 class 的 bean 刚刚调用了目标方法:
<bean class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetObject" ref="xmlConfiguration"/>
<property name="targetMethod" value="load"/>
<property name="arguments" value="SystemProperty.xml"/>
</bean>
我个人更喜欢第一种变体,因为定制更灵活并且没有多余的bean实例。但是你可以选择任何人。
希望这会有所帮助。
我有一个 xmlConfiguration bean 来加载 SystemProperty.xml 文件,如下所示
<bean
id="xmlConfiguration"
class="org.apache.commons.configuration.XMLConfiguration"
lazy-init="true">
<constructor-arg type="java.lang.String">
<value>SystemProperty.xml</value>
</constructor-arg>
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
</bean>
它工作正常,但是,我必须在 XMLConfiguration 中将 delimiterParsingDisabled 设置为 true,所以我更改了 bean 以添加 属性 delimiterParsingDisabled
<bean
id="xmlConfiguration"
class="org.apache.commons.configuration.XMLConfiguration"
lazy-init="true">
<constructor-arg type="java.lang.String">
<value>SystemProperty.xml</value>
</constructor-arg>
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
<property name="delimiterParsingDisabled">
<value type="java.lang.Boolean">true</value>
</property>
</bean>
但是,这不会很好地工作。由于 setDelimiterParsingDisabled()
必须在加载文件之前调用。因此,我必须在调用 setDelimiterParsingDisabled()
load(String fileName)
我已经使用 MethodInvokingFactoryBean
这种方式,但出现如下异常
org.apache.commons.configuration.ConfigurationException: No file name has been set!
at org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:409)
at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.save(AbstractHierarchicalFileConfiguration.java:214)
at devicemanage.system.SystemConfigurationServiceImpl.saveSystemProperty(SystemConfigurationServiceImpl.java:232)
at datacollection.service.DataCollectionServiceImpl.syncWithDataCollection(DataCollectionServiceImpl.java:786)
at devicemanage.utility.SyncWithDCListener.run(SyncWithDCListener.java:51)
似乎文件没有设置到XMLConfiguration中,我的MethodInvokingFactoryBean
描述如下
<bean id="xmlConfigurationMethodInvokingBean"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="xmlConfiguration" />
<property name="targetMethod" value="load" />
<property name="arguments" value="SystemProperty.xml" />
</bean>
当然,将我的 xmlConfiguration
bean 更改为在新建构造函数时不加载文件,如下所示
<bean
id="xmlConfiguration"
class="org.apache.commons.configuration.XMLConfiguration"
lazy-init="true">
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
<property name="delimiterParsingDisabled">
<value type="java.lang.Boolean">true</value>
</property>
</bean>
不确定是我使用 MethodInvokingFactoryBean
的方法不对,还是我在使用参数将文件名字符串传递到 load()
感谢任何帮助。
第一种方式
我建议您创建自己的继承 class 并声明 init-method
:
package beans;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
public class CustomXMLConfiguration extends XMLConfiguration {
private String loadFileName;
private void init() throws ConfigurationException {
this.load(fileName);
}
public String getLoadFileName() {
return loadFileName;
}
public void setLoadFileName(String fileName) {
this.loadFileName = fileName;
}
}
在配置中,您可以按以下方式使用此 class:
<bean id="xmlConfiguration" class="beans.CustomXMLConfiguration" lazy-init="true"
init-method="init">
<property name="expressionEngine">
<bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" />
</property>
<property name="delimiterParsingDisabled">
<value type="java.lang.Boolean">true</value>
</property>
<property name="loadFileName" value="SystemProperty.xml"/>
</bean>
init()
方法将在 bean 初始化后立即调用。
第二种方式
您可以使用 MethodInvokingBean
class 的 bean。这个 class 的 bean 刚刚调用了目标方法:
<bean class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetObject" ref="xmlConfiguration"/>
<property name="targetMethod" value="load"/>
<property name="arguments" value="SystemProperty.xml"/>
</bean>
我个人更喜欢第一种变体,因为定制更灵活并且没有多余的bean实例。但是你可以选择任何人。
希望这会有所帮助。