Статьи

Использование @Alternative в приложении CDI

Существует много сценариев, в которых вы можете захотеть иметь более одной версии компонента и использовать его для разных целей. Типичное обоснование альтернативного компонента — для целей тестирования, когда альтернативный компонент представляет фиктивные данные. Преимущество заключается в том, что действующая система, к которой должен подключаться «настоящий» компонент, для получения активных данных, является удаленной или слишком трудоемкой для использования во время тестового сценария. Таким образом, вместо этого предоставляется фиктивный бин, который предоставляет статические данные.

В этом посте я приведу пример, который предоставляет корзину покупок с фиктивным компонентом прайс-листа.

Как настроить альтернативные реализации bean-компонентов

Реальный и альтернативный компонент должен реализовывать один и тот же интерфейс. В этом примере они реализуют интерфейс PriceList .

1
2
3
public interface PriceList {
    String priceList();
}
1
2
3
4
5
6
public class LivePriceList implements PriceList {
    public String priceList() {
        // connect to price list webservice or database
        return "Live Price List";
    }
}

Альтернативный компонент аннотируется @Alternative, чтобы идентифицировать его как альтернативную реализацию.

1
2
3
4
5
6
7
@Alternative
public class MockPriceList implements PriceList {
    public String priceList() {
        // use hard code prices for testing
        return "Mock Price List";
    }
}

Бин PriceList может быть введен с использованием интерфейса в качестве типа.

01
02
03
04
05
06
07
08
09
10
public class ShoppingCart {
 
    @Inject
    private PriceList priceList;
 
    public String ObtainPriceList(){
        return priceList.priceList();
    }
 
}

В этом примере настоящий bean-компонент PriceList будет вставлен в ShoppingCart с помощью CDI при его развертывании.

Используйте альтернативный боб

Чтобы использовать альтернативный бин, вы должны указать версию бина PriceList, которую хотите использовать в файле beans.xml .

1
2
3
4
5
6
7
<beans ...>
 
    <alternatives>
        <class>com.readlearncode.alternatives.MockPriceList</class>
    </alternatives>
 
</beans>

Указывается полное имя альтернативного компонента.

Вывод

Когда приложение развернуто, контейнер CDI внедрит альтернативный MockPriceList в bean-компонент ShoppingCart .

Исходный код

Исходный код для этого примера можно найти в репозитории ReadLearnCode GitHub .

Опубликовано на Java Code Geeks с разрешения Алекса Тидома, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Использование @Alternative в приложении CDI

Мнения, высказанные участниками Java Code Geeks, являются их собственными.