#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 и другие фреймворки уже обеспечивают внедрение зависимостей. Не изобретайте велосипед.