简体   繁体   中英

Spring autowire interface

I have an Interface IMenuItem

public interface IMenuItem {

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

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

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

}

Then I have a implementation for this 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

}

Is there any way to create multiple instances of MenuItem from a configuration class, using only the IMenuItem interface? with @autowired or something ? Also is it possible to autowire by specifying the arguments of the constructor ?

@Autowired is actually perfect for this scenario. You can either autowire a specific class (implemention) or use an interface.

Consider this example:

public interface Item {
}

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

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

Now you can choose which one of these implementations will be used simply by choosing a name for the object according to the @Component annotation value

Like this:

@Autowired
private Item itemA; // ItemA

@Autowired
private Item itemB // ItemB

For creating the same instance multiple times, you can use the @Qualifier annotation to specify which implementation will be used:

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

In case you need to instantiate the items with some specific constructor parameters, you will have to specify it an XML configuration file. Nice tutorial about using qulifiers and autowiring can be found HERE .

i believe half of job is done by your @scope annotation , if there is not any-other implementation of ImenuItem interface in your project below will create multiple instances

@Autowired
private IMenuItem menuItem

but if there are multiple implementations, you need to use @Qualifer annotation .

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

this will also create multiple instances

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM