Spring внедряет объект, созданный с использованием экземпляра, вызванного из статического метода - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть объект, созданный следующим образом:

 serviceValidatorObject = ServiceFactory.getInstance().getServiceValidator()

Объект создается из вызова статического метода getInstance(), затем метода экземпляра, getServiceValidator().

Вместо этого я хочу использовать Spring инъекцию для настройки этого.

Проблема в том, что ServiceFactory является устаревшим кодом, который я не могу изменить.

Я знаю, что Spring поддерживает внедрение через статический класс фабрики или метод экземпляра,но есть ли способ настроить создание объекта выше в Spring?

Ответы [ 3 ]

4 голосов
/ 19 сентября 2011
<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>

В вашем случае exampleBean - это ваш serviceValidatorObject, фабричный бин - serviceFactory, а фабричный метод - getServiceValidator. Вам это тоже может понадобиться:

<bean id="serviceFactory"
      factory-method="getInstance"/>
0 голосов
/ 28 ноября 2011

Вы сможете достичь этого, используя:

<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;
0 голосов
/ 19 сентября 2011

Вы можете использовать это определение бина:

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