2015-06-30 3 views
6

У меня есть IMenuItem интерфейсSpring интерфейс autowire

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 

} 

Есть ли способ, чтобы создать несколько экземпляров MenuItem из класса конфигурации, используя только интерфейс IMenuItem? с @autowired или что-то еще? Также можно автоушилить, указав аргументы конструктора?

ответ

16

@Autowired на самом деле идеально подходит для этого сценария. Вы можете либо autwire определенный класс (реализация), либо использовать интерфейс.

Рассмотрим следующий пример:

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. Хороший учебник по использованию qulifiers и autowiring можно найти HERE.

+0

У меня есть только одна реализация (MenuItem). Я хочу создать, например, 3 MenuItems, но только через интерфейс. –

+0

См. Отредактированный ответ, надеюсь, что это поможет. Вам понадобится аннотация для классификатора – Smajl

1

я считаю, половина работы сделана вашей @scope аннотации, если нет какой-либо-другой реализация интерфейса ImenuItem в проекте ниже будет создать несколько экземпляров

@Autowired 
private IMenuItem menuItem 

, но если есть несколько реализаций, вы необходимо использовать аннотацию @Qualifer.

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

это будет также создать несколько экземпляров

+0

Хорошо, но есть ли способ активировать несколько пунктов меню с заданными параметрами? I @autowired использовать конструктор в MenuItem, а не пустой конструктор по умолчанию. –

+0

вам необходимо аннотировать конструктор с @Autowired. но он не работает с примитивным типом данных, вам нужно создать еще одно Pojo с String iconClass, String link, String text и ввести Pojo как bean – Bhupi

+0

Почему он создает несколько экземпляров, когда для интерфейса 'IMenuItem' существует только одна реализация? – Lucky

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