2012-03-16 2 views
1

Я пытаюсь понять, как работает Injection Dependency. Я читаю Pro Spring 2.5 и добрался до главы 3. Некоторые вопросы, которые пришли мне на ум:Зависимость впрыска весной

Когда вы делаете фабрику фасонных в основном методе своего автономного приложения (было бы интересно узнать в веб-приложение тоже), а затем прочитать файл конфигурации компонента, что происходит потом? Создает ли bean-компоненты со своими зависимостями в этой точке и сохраняет их в регистре или это просто информация о конфигурации, которую он хранит в регистре?

Я понимаю, что вы должны попытаться сохранить поиск зависимостей до минимума, так что если у вас есть класс MyApplication или что-то, что загружает приложение, которое является предпочтительным. Теперь, как Spring или POJO знают, где и когда вводить зависимости, если фабрика с регистром доступна только в основном методе? Разве регистр не доступен только в основном методе? Поскольку вы не называете «getBean (...)» больше, где происходит построение? Как это удается, чтобы сохранить бобы как синглеты и т. Д.?

+0

ли вы задали тот же вопрос 7 часов назад? http://stackoverflow.com/questions/9734483/how-is-dependency-injection-working – Ralph

ответ

1

ли это создать бобы с их зависимостями в этот момент и сохраняет те в регистре

Да, по умолчанию, когда вы создаете экземпляр BeanFactory или ApplicationContext (см: BeanFactory vs ApplicationContext) Spring создает все бобы и проводов их. Исключение составляют бобы с lazyscope, но если они являются иждивенцами из ленивых бобов, они будут созданы, несмотря на это.

Весна также управляет правильным порядком инициализации боба.

Теперь, как бы весной или знать, Pojo, где и когда вводить зависимости

В принципе, все бобы живут внутри контейнера Spring. Если вы получаете один бит, он уже имеет ссылки на его прямые зависимости. Они по очереди имеют зависимости от других. Суть заключается в следующем: все бобы, как правило, создаются и подключаются при запуске, и они являются отдельными синглтонами.

Смотрите также

+0

Итак, что вы говорите о том, как и когда они получают свои зависимости, это то, что MyApplication может иметь зависимость от класса A, который снова имеет зависимости от B и C и так далее? Но я все еще не понимаю реестр бобов, когда вы используете инъекцию зависимостей вместо поиска зависимостей, где вы вручную обращаетесь к фабрике компонентов и регистрации. Как каждый класс получает свои зависимости? – LuckyLuke

+0

@viper: как это объяснить ... После создания контекста приложения все компоненты создаются и подключаются. Все происходит автоматически и с нетерпением при запуске. Spring сначала создаст 'B' и' C', затем создаст 'A' и вводит' B' и 'C' в. Наконец, он создаст 'MyApplication' и добавит' C'. Все это делается при запуске и сохраняется в памяти. Когда вы задаете 'BeanFactory' для экземпляра' MyApplication', он просто возвращает уже созданный bean-компонент с введенными зависимостями. Вызов 'getBean()' возвращает ** уже существующий **, проводной компонент. –

+0

У вас есть 5 минут свободного времени в ночное время, чтобы прийти в чат Java? – LuckyLuke

2

Я думаю, на это лучше всего ответить, читая ссылки, размещенные здесь: What is dependency injection? Особенно статья Мартина Фаулера.

Подумайте обо всех ваших объектах, живущих внутри контейнера. Объекты внутри этого контейнера имеют весь жизненный цикл (создание, уничтожение, инициализация), управляемые весной или другими объектами внутри контейнера. Итак, когда происходит строительство класса? Ну, когда вы вызываете getBean(), Spring попытается извлечь этот экземпляр класса для вас. Он будет иметь определенные зависимости (свойства, управляемые с помощью пружины), поэтому весна также будет создавать экземпляры этих классов, у которых также будут результирующие зависимости и т. Д., Пока не будет построена соответствующая часть графического объекта вашего приложения.

При отключении контейнера (BeanFactory или ApplicationContext, весна затем обрабатывает любое отключение необходимого (т.е. уничтожение соединений с базами данных и т.д.).

Синглтон бобы (фасоль, для которых только один экземпляр будет существовать в течение всей жизни приложение) предварительно создаются, но это не является обязательным требованием. Весь объектный граф может быть построен лениво по запросу.

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

+0

Спасибо, что очистили некоторые части, однако, поскольку вы только вызываете «getBean()» в начальной точке, как Spring может ввести правильное значение зависимостей и т. д., когда другие классы никогда не ссылаются на завод? – LuckyLuke

+0

Spring вызывает конструктор этих классов, им не нужна ссылка на завод. – wds

+0

Да, спасибо. Я понял концепцию сейчас, и я вижу, что сначала понял ее полностью :) – LuckyLuke

Смежные вопросы