使用MethodInvokingFactoryBean设置非常规bean

时间:2011-03-23 03:21:41

标签: java spring

我正在尝试设置HostConfiguration bean。它拥有的一个属性称为proxyHost。但是,apache HostConfiguration类不遵循java bean约定。 proxyHost的setter接受类型为ProxyHost的参数,而getter返回一个String。

我的applicationContext.xml中有以下代码段。

    <bean id="proxyHost" class="org.apache.commons.httpclient.ProxyHost">
        <constructor-arg index="0" type="java.lang.String" value="myproxy.com" />
        <constructor-arg index="1" type="int" value="8087" />
    </bean>
    <bean id="hostConfiguration" class="org.apache.commons.httpclient.HostConfiguration">
         <property name="proxyHost" ref="proxyHost" />
    </bean>

当我尝试为应用程序加载applicationContext时,我收到以下错误,因为HostConfigurationClass没有返回ProxyHost的getProxyHost或带有字符串的setter: -

  

org.springframework.beans.NotWritablePropertyException:bean类的属性'proxyHost'无效[org.apache.commons.httpclient.HostConfiguration]:Bean属性'proxyHost'不可写或者setter方法无效:参数是否参数setter的类型与getter的返回类型匹配?

在泉源论坛上搜索时,我遇到了thread,建议使用MethodInvokingFactoryBean来解决此问题。

我不确定使用MethodInvokingFactoryBean如何提供帮助,因为我需要方法ProxyHost的返回类型getProxyHost()才能解决此问题,对吧?而且我不确定如何在这种情况下使用它。我不清楚MethodInvokingFactoryBean的内部。因此,如果有人可以请在上面的背景下给我一个例子,如何使用MethodInvokingFactoryBean这将是非常有帮助的。

这通常是设置像HostConfiguration这样的bean在春天不符合惯例的公认方法吗?

谢谢!

2 个答案:

答案 0 :(得分:9)

首先,实例化ProxyHost
(即ProxyHost proxyHost = new ProxyHost("myproxy1.com",8080);

<bean id="proxyHost" class="org.apache.commons.httpclient.ProxyHost">
        <constructor-arg index="0" type="java.lang.String" value="myproxy1.com" />
        <constructor-arg index="1" type="int" value="8088" />
</bean>

然后实例化HostConfiguration对象
(即HostConfiguration hostConfiguration = new HostConfiguration();

<bean id="hostConfiguration" class="org.apache.commons.httpclient.HostConfiguration" />

之后,使用MethodInvokingFactoryBean致电setProxyHost()上的HostConfiguration并传递proxyHost作为参数。
(即hostConfiguration.setProxyHost(proxyHost);

 <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetObject">
                <ref local="hostConfiguration"/>
            </property>
            <property name="targetMethod">
                <value>setProxyHost</value>
            </property>
            <property name="arguments">
                <ref local="proxyHost"/>
            </property>
    </bean>

答案 1 :(得分:1)

如其他答案所述,您可以实施FactoryBean。如果您使用的是Spring 3.0,还可以查看Java Configuration - @Configuration / @Bean。