2012-03-03 14 views
6

Chciałbym zbudować własne niestandardowe środowisko DI oparte na adnotacjach Java i potrzebuję małego kierunku, aby zacząć. Wiem, że byłoby znacznie łatwiej użyć jednej z wielu wspaniałych struktur, takich jak guice czy wiosna, ale ze względu na moją własną ciekawość chciałbym zbudować własną.Wstrzykiwanie zależności z adnotacjami

Nie jestem obeznany z adnotacjami, więc mam problem ze znalezieniem zasobów i naprawdę doceniam kogoś, kto wymyślił kilka kroków, które muszę wykonać, aby zacząć.

Jak wcześniej wspomniano, id lubi podejście do fabryki i jakoś etykietować moje pobiera z adnotacją typu @Resource lub @Injectable, a następnie w moich klasach biznesowych być w stanie ustawić moje zależności zmiennych z adnotacją @Inject i mieć zasób jest automatycznie dostępny.

Czy ktoś ma jakiekolwiek zasoby, które mogą przekazać, aby pomóc mi zrozumieć proces oznaczania metod na podstawie adnotacji, a następnie pobieranie wartości z oddzielnej klasy na podstawie adnotacji. Potrzebuję tylko małego kierunku, czegoś, co pomoże mi zacząć. I oczywiście z przyjemnością opublikuję tutaj małą próbkę kodu, gdy tylko zacznę, dla dobra innych przyszłych lektur.

EDIT

Zasoby używam umieścić to razem:

Java Reflection: Annotations

How to find annotations in a given package: Stack Overflow ?

Scanning Annotations at Runtime

nie mam faktycznie skończył pisać to jeszcze, ale podstawowym zadaniem li st będzie następująco (dla każdego, kto może być zainteresowany w tym coś podobnego w przyszłości)

  1. Na skanie klasa wykonawczego dla wszystkich pól @Inject i uzyskać typ obiektu.

  2. Skanowanie wszystkich klas (lub tylko określonego pakietu klas (nie miałem jeszcze decyzji )) dla adnotowanych metod @InjectableResource.

  3. Zapętlaj wszystkie metody z adnotacjami i znajdź metodę zwracającą żądany typ obiektu .

  4. Uruchom metodę i uzyskaj zależność.

Przydatne będzie również odnotowanie, że podczas skanowania wszystkich zajęć będę korzystać z biblioteki o nazwie Javassist. Zasadniczo to, co to robi, pozwala mi odczytać informacje o bajtach każdej klasy bez faktycznego ładowania klasy. Dzięki temu mogę czytać ciągi adnotacji bez powodowania poważnych problemów z pamięcią.

+0

Możesz zacząć od standardowego [Oracle Adnotation Trail] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html). Będziesz potrzebował jakiegoś sposobu zeskanowania całej ścieżki klas dla zasobów, jednym ze sposobów byłoby użycie narzędzia takiego jak [Google Reflections] (http://code.google.com/p/reflections/). I wreszcie będziesz potrzebował jakiegoś sposobu manipulowania klasami, na przykład z [Javassist] (http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/). – Perception

Odpowiedz

0

Interesujące, że chcesz zbudować własny. Uwielbiam Google Guice - sprawia, że ​​kod jest tak elegancki i prosty.

Użyłem przedrostka this guide, przed którym znalazłem przydatne informacje na temat adnotacji i sposobów ich wyciągania z zajęć i metod.

Będziesz musiał zdefiniować własne adnotacje, które są wykonywane przy użyciu @ interfejsu. Następnie musisz zdefiniować jakąś klasę do wykonywania wiązań np. gdzie widać powiązanie interfejsu w tej konkretnej klasie. Na koniec będziesz potrzebować logiki, aby ją w całości ściągnąć. przejść przez każdą klasę, znaleźć każdą adnotację, a następnie znaleźć odpowiednie powiązanie.

Weź pod uwagę takie rzeczy jak leniwe tworzenie poprzez Odbicia i pojedynki. Guice, na przykład, pozwala na użycie singletonu, więc twój jedyny używa jednej instancji konkretnej klasy lub możesz za każdym razem związać nową wersję.

Powodzenia!

+0

Wielka rada do tej pory. Połączony zasób jest pomocny. Wszelki wgląd w to, jak faktycznie powiązać metodę (getter, który tworzy zasób w moim przypadku) z adnotacją? Dostaję, jak utworzyć niestandardową adnotację i ustawić zmienne dostępu wewnątrz tej adnotacji, ale jak mam wprowadzić @Inject do klasy fabrycznej i konkretnej metody? – ryandlf

+0

Nie stworzyłem własnego schematu wtrysku zależności, więc moim sposobem byłoby po prostu przejść o tym, jak Guice to robi. Będziesz potrzebował metody bind, która zajmie interfejs, adnotację i konkretną klasę. W tym celu Guice ma moduł AbstractModule, który jest tworzony przez konkretne moduły zdefiniowane przez użytkowników, które definiują wszystkie powiązania. Zobacz tutaj: http://code.google.com/p/google-guice/wiki/BindingAnnotations – christophmccann

Powiązane problemy