Co by tu sobie wstrzyknąć? Słów parę o Qualifiers w CDI.

Bartek Drzazgowski
2 min readAug 21, 2017

--

Tym razem podejmiemy temat wstrzykiwania zależności z użyciem CDI. Wyobraźmy sobie scenariusz, w którym mamy do wstrzyknięcia interfejs, implementowany przez kilka różnych klas. Nasz przykład opierać będzie się na hipotetycznym generatorze numerów rejestracyjnych.

Nasze początkowe implementacje dla Gdańska i Gdyni:

Kod jest bardzo prosty, jedyna niewiadoma to klasa SufixNumberGenerator. Dostarcza ona drugą część numeru rejestracyjnego, ale nie musimy się nią na tę chwilę przejmować.

W innej części aplikacji postanawiamy wstrzyknąć LicencePlateNumberGenerator:

Niestety naszym oczom ukaże się wyjątek “Ambiguous dependencies for type LicencePlateNumberGenerator with qualifiers @Default”. I tu po raz pierwszy stykamy się z tytułowymi Qualifiers. @Default wskazuje, że mówimy o adnotacjach. Dodatkowo przypomnijmy, że domyślnie każdy bean zarządzany przez CDI otrzymuje Qulifier @Default. Składając te informacje do kupy: po uruchomieniu CDI widzi dwa beany adnotowane jako Default i nie wie, który ma wstrzyknąć :(

Na szczęście nic nie stoi na przeszkodzie, aby napisać własny Qualifier i jawnie wskazać o którą implementacje nam chodzi. Spójrzmy jak może to wyglądać:

Następnie adnotujemy naszego beana nowo stworzoną adnotacją:

I wstrzykujemy konkretną implementację:

Co ciekawe od tego momentu, wstrzyknięcie LicencePlateNumberGenerator, bez dodania qualifier również zadziała. W tym momencie mamy już tylko jeden bean z adnotowany jako Default.

Kod zawierający powyższy przykład można znaleźć na moim GitHubie: link.

--

--