2015-06-30 23 views
6

ho un IMenuItem interfacciaPrimavera interfaccia autowire

public interface IMenuItem { 

    String getIconClass(); 
    void setIconClass(String iconClass); 

    String getLink(); 
    void setLink(String link); 

    String getText(); 
    void setText(String text); 

} 

Poi ho un'implementazione per questa interfaccia

@Component 
@Scope("prototype") 
public class MenuItem implements IMenuItem { 

    private String iconClass; 
    private String link; 
    private String text; 

    public MenuItem(String iconClass, String link, String text) { 
     this.iconClass = iconClass; 
     this.link = link; 
     this.text = text; 
    } 

    //setters and getters 

} 

Esiste un modo per creare più istanze di MenuItem da una classe di configurazione, utilizzando solo l'interfaccia IMenuItem? con @autowired o qualcosa del genere? È anche possibile autowire specificando gli argomenti del costruttore?

risposta

16

@Autowired è in realtà perfetto per questo scenario. È possibile autorizzare una classe specifica (implementazione) o utilizzare un'interfaccia.

Considerate questo esempio:

public interface Item { 
} 

@Component("itemA") 
public class ItemImplA implements Item { 
} 

@Component("itemB") 
public class ItemImplB implements Item { 
} 

Ora è possibile scegliere quale di queste implementazioni saranno utilizzati semplicemente scegliendo un nome per l'oggetto in base al valore @Component annotazione

Ti piace questa:

Per creare la stessa istanza più volte, è possibile utilizzare l'annotazione @Qualifier per specificare quale implementazione sarà utilizzato:

@Autowired 
@Qualifier("itemA") 
private Item item1; 

In caso di necessità di istanziare gli oggetti con alcuni parametri del costruttore specifiche, sarà necessario specificarlo un file di configurazione XML. Un bel tutorial sull'utilizzo di qulifiers e autowiring può essere trovato HERE.

+0

Ho solo un'implementazione (MenuItem). Voglio creare per esempio 3 MenuItems, ma solo attraverso l'interfaccia. –

+0

Vedere la risposta modificata, spero che aiuti. Avrai bisogno dell'annotazione del qualificatore – Smajl

1

credo metà del lavoro è fatto dal vostro @scope annotazione, se non v'è alcuna-altra implementazione dell'interfaccia ImenuItem nel progetto di seguito creerà più istanze

@Autowired 
private IMenuItem menuItem 

ma se ci sono più implementazioni, è è necessario utilizzare l'annotazione @Qualifer.

@Autowired 
@Qualifer("MenuItem") 
private IMenuItem menuItem 

questo sarà anche creare più istanze

+0

Ok, ma c'è un modo per instanciare più menuItem con determinati parametri? Ho @autowired di utilizzare il costruttore in MenuItem, non il costruttore vuoto predefinito. –

+0

è necessario annotare il costruttore con @Autowired. ma non ha funzionato con il tipo di dati primitivi, è necessario creare un altro Pojo con String iconClass, String link, String text e iniettare Pojo come bean – Bhupi

+0

Perché creerà istanze multiple quando esiste solo un'implementazione per l'interfaccia 'IMenuItem'? – Lucky