web-dev-qa-db-ja.com

Spring autowireインターフェイス

IMenuItemインターフェイスがあります

public interface IMenuItem {

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

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

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

}

次に、このインターフェイスの実装があります

@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

}

IMenuItemインターフェイスのみを使用して、構成クラスからMenuItemの複数のインスタンスを作成する方法はありますか? @autowiredか何かで?また、コンストラクタの引数を指定して自動配線することは可能ですか?

9
adi.neag

@Autowiredは、実際にはこのシナリオに最適です。特定のクラス(実装)を自動配線するか、インターフェースを使用できます。

この例を考えてみましょう:

public interface Item {
}

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

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

これで、@Componentアノテーション値に従ってオブジェクトの名前を選択するだけで、これらの実装のどれを使用するかを選択できます

このような:

@Autowired
private Item itemA; // ItemA

@Autowired
private Item itemB // ItemB

同じインスタンスを複数回作成する場合は、@ Qualifierアノテーションを使用して、使用する実装を指定できます。

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

特定のコンストラクターパラメーターを使用して項目をインスタンス化する必要がある場合は、XML構成ファイルを指定する必要があります。修飾子と自動配線の使用に関する素晴らしいチュートリアルが見つかります [〜#〜]ここ[〜#〜]

24
Smajl

私の仕事の半分は@scopeアノテーションによって行われると思います。以下のプロジェクトにImenuItemインターフェイスの他の実装がない場合、複数のインスタンスが作成されます

@Autowired
private IMenuItem menuItem

ただし、複数の実装がある場合は、@Qualiferアノテーションを使用する必要があります。

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

これにより、複数のインスタンスも作成されます

1
Bhupi