Co by tu sobie wstrzyknąć? Słów parę o Qualifiers w CDI.
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.