Внедрение зависимостей с аннотациями - PullRequest
6 голосов
/ 03 марта 2012

Я хотел бы построить свою собственную DI-инфраструктуру на основе аннотаций Java, и мне нужно небольшое руководство, чтобы начать.Я знаю, что было бы намного проще использовать одну из множества замечательных фреймворков, таких как guice или spring, но ради собственного любопытства я хотел бы построить свою собственную.

ЯЯ не очень знаком с аннотациями, поэтому у меня возникли некоторые проблемы с поиском ресурсов, и я был бы очень признателен, если бы кто-то просто изложил несколько шагов, которые мне нужно предпринять, чтобы начать работу.

Как и преждеКак уже упоминалось, id хотел бы использовать фабричный подход и каким-то образом пометить мои получатели аннотацией типа @Resource или @Injectable, а затем в моих бизнес-классах иметь возможность устанавливать переменные зависимости с помощью аннотации @Inject и иметь ресурс автоматически доступным.

Есть ли у кого-нибудь какой-либо ресурс, который он может передать, чтобы помочь мне понять процесс тегирования методов на основе аннотаций и последующего извлечения значений из отдельного класса на основе аннотации.Небольшое направление - это все, что мне нужно, кое-что, чтобы начать меня.И, конечно, я буду рад опубликовать здесь небольшой пример кода, как только я начну, для дальнейшего чтения, конечно, для других.

РЕДАКТИРОВАТЬ

ресурсы, которые я использую, чтобы собрать это вместе:

Отражение Java: аннотации

Как найти аннотации в данном пакете: переполнение стека?

Сканирование аннотаций во время выполнения

На самом деле я еще не закончил писать это, но список основных задач будет следующим (для тех, кто может быть заинтересован в выполнениичто-то похожее в будущем)

  1. Во время сканирования класса для всех полей @Inject и получения типа объекта.

  2. Сканирование всех классов (или простоопределенный пакет классов (я еще не решил)) для аннотированных методов @InjectableResource.

  3. Выполните цикл всех аннотированных методов и найдите метод, который возвращает искомый тип объекта.

  4. Запустите метод и получите зависимость.

Также будет полезно отметить, что при сканировании всех классов я буду использовать библиотеку под названием Javassist.По сути, это позволяет мне читать информацию о байт-коде каждого класса без фактической загрузки класса.Так что я могу читать строки аннотаций, не создавая серьезных проблем с памятью.

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Посмотрите на следующие методы:

java/lang/Class.html#getAnnotation(java.lang.Class)

java/lang/Class.html#getAnnotations()

java/lang/Class.html#getDeclaredAnnotations()

Методы с тем же именем также существуют для классов java/lang/reflect/Method, java/lang/reflect/Field и java/lang/reflect/Constructor.

Итак, чтобы использовать эти виды методов, вам нужно немного знать о Java отражении .

0 голосов
/ 03 марта 2012

Интересно, что вы хотите построить свой собственный.Мне нравится Google Guice - он делает код таким элегантным и простым.

Я использовал это руководство , перед которым я обнаружил, что это довольно полезно для изучения аннотаций и способов их извлечения из классов.и методы.

Вы должны будете определить свои собственные аннотации, что делается с помощью @interface.Затем вам придется определить какой-то класс для выполнения привязок, например, где вы видите привязку интерфейса в этом конкретном классе.Наконец, вам понадобится некоторая логика, чтобы вытащить ее целиком, например, пройти через каждый класс, найти каждую аннотацию, а затем найти подходящую привязку.

Обдумайте такие вещи, как ленивая реализация с помощью Reflections и singletons.Guice, например, позволяет вам использовать синглтон, так что вы можете использовать только один экземпляр конкретного класса, или вы можете связывать новую версию каждый раз.

Удачи!

...