Я немного смущен этими двумя понятиями. Читая документацию Spring, я узнал, например. что bean заводы Spring контейнеры. Я также читал, что "ApplicationContext - это полный набор BeanFactory". Но разница между ними не очевидна. Так в чем же разница?
В чем разница между контекстом приложения Spring и контейнером Spring?
Ответ 1
Ответы этой ссылки, прилагаемые Ajinkya, довольно обширны, однако я хотел бы ссылаться на некоторые хорошие моменты из другого материала - Spring в действии (Manning Publications ):
В приложении Spring ваши объекты приложения будут жить в контейнере Spring. Как показано на рисунке 2.1, контейнер будет создавать объекты, связывать их вместе, настраивать их и управлять их полным жизненным циклом от крэдла до могилы (или, если возможно, новым для finalize()).
Нет единственного контейнера Spring. Spring поставляется с несколькими реализациями контейнеров, которые можно разделить на два разных типа. Bean заводы (определенные интерфейсом org.springframework.beans.factory.BeanFactory) являются простейшими контейнерами, обеспечивающими базовую поддержку DI. Контексты приложения (определенные интерфейсом org.springframework.context.ApplicationContext) основываются на понятии Bean factory, предоставляя сервисы инфраструктуры приложения, такие как возможность разрешать текстовые сообщения из файла свойств и возможность публикации приложений для заинтересованных слушателей событий.
На поверхности ApplicationContext почти такой же, как BeanFactory. Оба загружают определения Bean, провод beans вместе и выдают beans по запросу. Но ApplicationContext предлагает гораздо больше:
- Контексты приложений предоставляют средства для разрешения текстовых сообщений, включая поддержку интернационализации (I18N) этих сообщений.
- Контексты приложений предоставляют общий способ загрузки файловых ресурсов, например изображений.
- Контексты приложений могут публиковать события beans, зарегистрированные в качестве слушателей.
Из-за дополнительных возможностей, которые он предоставляет, ApplicationContext предпочтительнее, чем BeanFactory почти во всех приложениях. Единственный раз, когда вы можете использовать BeanFactory, - это ситуации, когда ресурсов недостаточно, например, мобильного устройства.
Помимо дополнительной функциональности, предлагаемой контекстами приложений, еще одна большая разница между контекстом приложения и Bean factory заключается в том, как загружаются singleton beans. A Bean factory лениво загружает все beans, откладывая создание Bean до вызова метода getBean(). Контекст приложения немного умнее и предварительно загружает все singleton beans при запуске контекста. Предварительно загружая singleton beans, вы гарантируете, что они будут готовы к использованию в случае необходимости - вашему приложению не придется ждать их создания.