Spring注入一个使用从静态方法调用的实例创建的对象

时间:2011-09-19 18:00:54

标签: java spring factory code-injection

我创建了一个如下对象:

 serviceValidatorObject = ServiceFactory.getInstance().getServiceValidator()

该对象是通过调用静态方法getInstance()创建的,然后是实例方法getServiceValidator()

我想使用Spring注入来配置它。

问题是ServiceFactory是我无法改变的遗留代码。

我知道Spring通过工厂类静态或实例方法支持注入,但无论如何我可以在Spring中配置上面的对象创建吗?

3 个答案:

答案 0 :(得分:4)

<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>

在您的情况下,exampleBean是您的serviceValidatorObject,工厂bean是serviceFactory,工厂方法是getServiceValidator。你也可能需要这个:

<bean id="serviceFactory"
      factory-method="getInstance"/>

答案 1 :(得分:0)

您可以使用此bean定义:

<bean id="serviceValidatorObject" factory-bean="serviceFactory" factory-method="getServiceValidator"/>  
<bean id="serviceFactory" class="<package>.ServiceFactory" /> 

答案 2 :(得分:0)

您应该能够使用以下方法实现这一目标:

<bean id="myCreatedObjectBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass">
        <value>com.mycompany.MyFactoryClass</value>
    </property>
    <property name="targetMethod">
        <value>myFactoryMethod</value>
    </property>
</bean>

然后你可以使用@Resource或@Autowired + @Qualifier直接注入你的对象。

对于此示例,您的applicationContext.xml应包含:

<!-- this allows Spring to create an instance of your Factory -->
<bean id="serviceFactoryBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass">
        <value>yourpackage.ServiceFactory</value>
    </property>
    <property name="targetMethod">
        <value>getInstance</value>
    </property>
</bean>

<!-- this allows Spring to use the factory instance to create the instance of ServiceValidator -->
<bean id="serviceValidatorBean" factory-bean="serviceFactoryBean" factory-method="getServiceValidator"/>

然后你可以通过以下方式注入你的代码:

@Resource(name = "serviceValidatorBean")
ServiceValidator serviceValidator;