web-dev-qa-db-fra.com

Interface à ressort automatique

J'ai une interface IMenuItem

public interface IMenuItem {

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

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

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

}

Ensuite, j'ai une implémentation pour cette interface

@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

}

Existe-t-il un moyen de créer plusieurs instances de MenuItem à partir d'une classe de configuration, en utilisant uniquement l'interface IMenuItem? avec @autowired ou quelque chose? Est-il également possible de câbler automatiquement en spécifiant les arguments du constructeur?

9
adi.neag

@Autowired est en fait parfait pour ce scénario. Vous pouvez soit câbler automatiquement une classe spécifique (implémentation) ou utiliser une interface.

Considérez cet exemple:

public interface Item {
}

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

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

Vous pouvez maintenant choisir laquelle de ces implémentations sera utilisée simplement en choisissant un nom pour l'objet en fonction du @Component valeur d'annotation

Comme ça:

@Autowired
private Item itemA; // ItemA

@Autowired
private Item itemB // ItemB

Pour créer plusieurs fois la même instance, vous pouvez utiliser l'annotation @Qualifier pour spécifier quelle implémentation sera utilisée:

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

Dans le cas où vous devez instancier les éléments avec des paramètres de constructeur spécifiques, vous devrez lui spécifier un fichier de configuration XML. Un joli tutoriel sur l'utilisation des qulifiers et du câblage automatique peut être trouvé ICI .

24
Smajl

je crois que la moitié du travail est fait par votre @scope annotation, s'il n'y a pas d'autre implémentation de l'interface ImenuItem dans votre projet ci-dessous, cela créera plusieurs instances

@Autowired
private IMenuItem menuItem

mais s'il existe plusieurs implémentations, vous devez utiliser @Qualifer annotation.

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

cela créera également plusieurs instances

1
Bhupi