Zarządzanie modułami Guice za pomocą ServiceLoader
Skoro w tytule siedzi nazwa klasy to oznacza, że będzie mocno technicznie. Jednak nie tym razem 🙂
Opis problemu
Generalnie mamy sobie kilkanaście niezależnych modułów Gucie, które łączone w różny sposób tworzą naszą aplikację. Świetnym przykładem tego typu rozwiązań są wszelkie aplikacje oparte o pluginy jak chociażby CMSy czy CRMy. Rzecz w tym, że instalacja wszystkich wymaganych modułów może być kłopotliwa. Dlaczego? Skoro moduły są niezależne to problem z konfiguracją odkryjemy dopiero po starcie aplikacji w dodatku problem ten najprawdopodobniej zgłoszą użytkownicy. Objawy? Na przykład brak części usług i funkcjonalności. Oczywiście są testy, ale…
Rozwiązanie
Nazywa się GeriW i jest moją propozycją na prosty moduł Guice. Co robi? Otóż wykorzystując mechanizm ServiceLoader wyszukuje i instaluje moduły Guice. W obecnej wersji jest to dość prymitywne rozwiązanie, które ma wiele wad, ale na pewno będę je rozwijał i zostaną one wyeliminowane.
Do pobrania z Githuba > Geri na GitHub.
Sposób użycia
Po pierwsze po stronie Guice wystarczy:
Listing 1. Użycie Geri
Guice.createInjector(new GeriModule());
Jednak by to zadziałało trzeba odpowiednio przygotować swoje moduły.
- W META-INF tworzymy katalog services
- W nim plik o nazwie com.google.inject.Module
- W pliku umieszczamy pełną, kwalifikowaną nazwę klasy implementującą interfejs com.google.inject.Module.
Moduł ma pewne ograniczenia:
- Powinien mieć konstruktor bezparametrowy.
- Może mieć konstruktor domyślny.
W przeciwnym wypadku całość posypie się z błędami z ServiceLoader.
Jeżeli chcemy ograniczyć możliwość ładowania modułów do ładowania ich z określonych ClassLoaderów to można wywołać Geri przekazując jako parametry konstruktora nasze ClassLoadery.