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.