2013-05-15 4 views
0

здесь некоторый код из поста здесь, что бы объяснить мой вопрос:Spring 3 Dependency Injection и интерфейсы

Интерфейс:

package org.better.place 

public interface SuperDuperInterface{ 
    public void saveWorld(); 
} 

реализации:

package org.better.place 

import org.springframework.stereotype 

public class SuperDuperClass implements SuperDuperInterface{ 
    public void saveWorld(){ 
      System.out.println("Done"); 
    } 
} 

Клиент:

package org.better.place 

import org.springframework.beans.factory.annotation.Autowire; 

public class SuperDuperService{ 

     private SuperDuperInterface superDuper; 

     public void doIt(){ 
      superDuper.saveWorld(); 
     } 

     public void setSuperDuper(SuperDuperInterface superDuper) { 
     this.superDuper = superDuper; 
     } 
} 

Мой вопрос - как я могу настроить компоненты в конфигурации весны? Я не хочу использовать @Autowired и другие аннотации.

Я предполагаю, что это будет что-то вроде этого:

<bean id="superService" class="org.better.place.SuperDuperService"> 
    <property name="superDuper" ref="superWorker" 
</bean> 

<bean id="superWorker" class=?????? parent=???????? > 
</bean> 

ответ

1

Вы должны создать экземпляр реализующего класса, конечно:

<bean id="superWorker" class="org.better.place.SuperDuperClass"/> 

Вам нужно будет только атрибут parent, если вы хотите создайте несколько компонентов с общими свойствами, которые вы не хотите повторно объявлять, поэтому переместите их в абстрактное определение родительского компонента, которое могут ссылаться на конкретные определения bean-компонента.
Предполагая SuperDuperClass имеют некоторые свойства:

<bean id="superWorkerPrototype" abstract="true" 
     class="org.better.place.SuperDuperClass"> 
    <property name="prop1" value="value1"/> 
    <property name="prop2" value="value2"/> 
</bean> 

<bean id="superWorker1" parent="superWorkerPrototype" 
     class="org.better.place.SuperDuperClass"> 
    <property name="prop3" value="foo"/> 
</bean> 

<bean id="superWorker2" parent="superWorkerPrototype" 
     class="org.better.place.SuperDuperClass"> 
    <property name="prop3" value="bar"/> 
</bean> 

Что бы привести оба экземпляра имеет то же значение для prop1 и prop2, но разные из них для prop3.

0

Вы можете просто дать полное имя класса реализации, и его не требуется указывать атрибут parent. Spring автоматически найдет, если он может назначить экземпляр SuperDuperClass в superDuper области SuperDuperService

<bean id="superWorker" class="org.better.place.SuperDuperClass" > 
</bean> 
+0

Я не вижу, что бы сделать Spring автоматически впрыскивать экземпляр 'SuperDuperClass' в' SuperDuperService' без использования '@Autowired 'в нем (чего OP хочет избежать). – zagyi

+0

, если вы явно не говорите @Autowired или упоминаете авто-провод в xml-источнике, не авто-провод. То, что я попытался объяснить здесь, заключается в том, чтобы избежать родительского тега, причина весны выяснит, может ли он назначить экземпляр или нет. – sanbhat

+0

Да, вот что я имею в виду. Ни один из них не находится в фрагменте кода в вопросе, поэтому не понимаю, почему вы написали, что «Spring автоматически найдет, может ли он назначить экземпляр SuperDuperClass в поле superDuper в SuperDuperService» – zagyi

Смежные вопросы