Я уже вовсю юзаю Spring, где на каждый "пук" ложиться @autowired. Все отлично работает, удобно и просто до обалдения. Но в один прекрасный момент я понял, что я ничего не понял) Как это работает? Коллеги! Помогите разобраться...
Интересует пример для чайников... Как без Spring проинжектить экземпляр одного класса в поле другого? Может ссылку простую дадите, или в комментах объясните.
Интересует пример для чайников... Как без Spring проинжектить экземпляр одного класса в поле другого? Может ссылку простую дадите, или в комментах объясните.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Так мне кажется, хе-хе, но я могу ошибаться. Если кто поправит, буду очень рад.
Ппц, как-то сложно написал. Вообщем, все реализовано через механизм рефлексии.
Находить второй бин через рефлекцию. Создаешь кота через newInstance конструктора, в качестве аргумента передаешь первый бин.
Я бы так сделал, но зачем тебе собственный велосипед придумывать?
В середине там только джава, и используются инструметны джавы, в т. ч. и отражение.
Бин проходит несколько этапов инициализации, от создания биндифинишинов до обработки бина пост процессором (ами)
тут кратко о каждом этапе.
Ладно, мой вопрос видимо тяжеловат для нашего сообщества. Это, кстати, вопрос с собеседования когда декларируешь знание Spring или других контейнеров, правда, выше джуниора.
Для такого класса Кет
public class Cat { @MyAutoWired private Animal animal; }метод инжекта приблизительно такой. Это частный случай, без дженериков и типов классов, без проверок и написан на скорую руку за 5 мин.public static Cat initialize() throws IllegalAccessException, InstantiationException { Cat cat = null; Field[] declaredFields = Cat.class.getDeclaredFields(); for (Field declaredField : declaredFields) { if (declaredField.getAnnotations() != null ) { for (Annotation annotation : declaredField.getAnnotations()) { if (annotation instanceof MyAutoWired) { cat = Cat.class.newInstance(); declaredField.setAccessible(true); declaredField.set(cat, Animal.class.newInstance()); } } } } return cat; }Далее это все проксируется и выдается как бин из класса Cat с проинициализированым полем private Animal animal;.Это самый примитивизм для поля. Для конструкторов или сетеров и гетеров будет ещё сложнее.
И чуть не забыл, аннотацию надо отмаркать
Совсем оффтоп… А предшественник то вм80 еще и эстетически прекрасным был!
Качаем и читаем тут
Например:
Понимание контейнера инверсии контроля (IoC) Spring
А лучше тут читать
Ну или на худой конец Бориcова посмотреть