2015-01-28 3 views
0

Я изучаю @Produces аннотацию инъекции зависимостей CDI от here. Я просто создал свой собственный пример. Тем не менее, я столкнулся с двусмысленной зависимостью.Неоднозначная зависимость при использовании аннотации @Produces

public interface Bank { 

    public void withdrawal(); 
    public void deposit(); 
} 

public class BankOfAmerica implements Bank { 

    @Override 
    public void withdrawal() { 
     System.out.println("Withdrawal from Bank of America"); 
    } 

    @Override 
    public void deposit() { 
     System.out.println("Deposit to Bank of America"); 
    } 
} 

public class BankFactory { 

    @Produces 
    public Bank createBank() { 
     return new BankOfAmerica(); 
    } 
} 

И это класс, в который впрыскивается боб.

public class ProducesExample { 

    @Inject 
    private Bank bankOfAmerica; 

    public void callBanksWithdrawal() { 
     bankOfAmerica.withdrawal(); 
    } 
} 

Я ценю за любую помощь.

EDIT: Я знаю, это своего рода дубликат этого question. Однако в учебнике, который я поделился, он говорит, что он должен работать. Более того, существует только один тип компонента, поэтому не нужно использовать @Default или @Alternatives, но все равно путайте, почему он не работает.

ответ

1

Учебное пособие является немного неоднозначным (каламбур) о том, какие классы должны быть развернуты симулятивно на каждом шагу, поэтому я бы не стал слишком беспокоиться об этом.

Ответ на другой вопрос, который вы связали, соответствует вашему делу. BankOfAmerica является фасолью типа Bank (в CDI 1.0 или в CDI 1.1+ с явными бобами), а ваш метод-производитель - еще один фасоль того же типа, отсюда и двусмысленное разрешение.

+0

Спасибо за ваш ответ. Я просто пытаюсь понять. Поэтому в нашем контексте у меня есть компонент «BankOfAmerica» и еще один bean-компонент под названием «ProducesExample», который имеет метод производителя для Bank bean. Я ожидал бы, когда банк будет впрыскиваться, чтобы метод производителя был вызван и ввел компонент BankOfAmerica. Кроме того, нет никакой другой реализации для интерфейса банка. – quartaela

0

Одна вещь, которая может быть полезна, - это ваш файл beans.xml.

Если вы хотите иметь фабрику (используя @produces), у вас не может быть bean-discovery-mode = "all". Если у вас есть все варианты, чем вы получите исключение из-за неоднозначных зависимостей, все ваши реализации будут автоматически сканироваться как возможные зависимости (что, на мой взгляд, является плохим параметром производительности).

Итак, поставьте bean-discovery-mode = "аннотированный", оставьте свои реализации cdi-аннотацией бесплатно и используйте @Dependent на заводе и @produces в методе построения.

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