Java: внедрение зависимостей путем самоанализа, рекурсии и аннотации

#java

#java

Вопрос:

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

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

Я вызываю my injectionService прямо перед созданием экземпляра сервлета: InjectionService.injectObject(ServletMain.class) и я надеюсь, что с помощью рекурсии он создаст экземпляр и разместит нужные объекты в нужных местах. Я использую HashMap для сохранения экземпляров каждого типа объекта, который я повторяю.

В моем ServletMain классе: вместо записи LoginController log = new LoginController(); я бы написал @ToInject LoginController log; .

Правильный ли это путь? Сейчас это не работает, но я не вижу, чего мне не хватает.

Редактировать / PS : причина, по которой я не использую инструменты, подобные Spring, заключается в том, что назначение не позволяет нам их использовать.

Я понимаю, что это очень конкретный вопрос, заранее благодарю вас за ответы.

     package utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import domain.factory.IFactory;

public class InjectionService {

  private static IFactory factory = null;
  private static HashMap<Object, Object> map_class_instance = new HashMap<Object, Object>();

  public static void injectObject(Object o) throws NoSuchMethodException, SecurityException,
      ClassNotFoundException, InstantiationException, IllegalAccessException,
      IllegalArgumentException, InvocationTargetException {

    Field[] fields = o.getClass().getDeclaredFields();
    for (Field f : fields) {
      if (f.isAnnotationPresent(ToInject.class)) {
        if (map_class_instance.get(o) == null) {
          Constructor cons = (Constructor) Class.forName((String) o).getDeclaredConstructor();
          cons.setAccessible(true);
          Object obj = cons.newInstance();
          map_class_instance.put(o.getClass(), obj);
          // recursif
          f.set(o, map_class_instance.get(f));
          injectObject(f);

        }
        f.set(o, map_class_instance.get(f));
        injectObject(f);
      }
    }
  }
  

Комментарии:

1. В чем вопрос? Если вы просто хотите, чтобы кто-то просмотрел ваш код, вам нужно опубликовать его на сайте code review.

2. «Я понимаю, что это очень специфический вопрос» => Какой вопрос?

3. Если вопрос в том, «Правильный ли это путь?», ответ — нет. CDI, SPring и другие фреймворки уже обеспечивают внедрение зависимостей. Не изобретайте велосипед.