Ответ 1
@feak дает прямой ответ о значении ApplicationContext
с точки зрения Spring. Короче говоря, это объект, который загружает конфигурацию (обычно на основе аннотации XML файла), а затем Spring начинает управлять bean-компонентами и их преимуществами:
- Бобы, заявленные в упаковке
- Бобы, объявленные аннотациями
- Конструктор и метод автопроводки
- Бобовая инъекция
- Конфигурация,.properties и загрузка файла .yaml
- так далее
Чтобы запустить контекст приложения, вы можете использовать одно из следующих:
-
Вручную загрузите контекст приложения в начале вашего приложения. Это делается для примера или в отдельных приложениях:
public class Foo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("path/to/applicationContext.xml"); //use the context as you wish... } }
-
В случае Java-приложений, использующих Spring MVC,
DispatchServlet
загрузит контекст приложения для вас, поэтому вам нужно всего лишь создать файл springapp-servlet.xml в папке WEB-INF приложения.
Обратите внимание, что контекст приложения связан с одной конфигурацией (на основе XML или нет). Период.
Поняв это, вы также можете понять, что у вас может быть более одного контекста приложения для каждого приложения. Это означает наличие двух или более ApplicationContext
в одном приложении. Из последнего примера в консольном приложении это легко проверить:
public class Foo {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("path/to/applicationContext.xml");
ApplicationContext context2 =
new ClassPathXmlApplicationContext("path/to/applicationContext.xml");
//use the context as you wish...
}
}
Обратите внимание, что у нас есть два контекста приложения, использующих одну и ту же конфигурацию XML. Ты можешь сделать это? Да, вы на самом деле видите это здесь. Какая тогда разница? Основное отличие состоит в том, что одноэлементные области действия бинов Spring являются одноэлементными для контекста приложения, это означает, что при извлечении компонента Bar
, настроенного в файле applicationContext.xml из context
, не будет совпадать с извлечением его из context2
, но несколько context2
извлечения из context
будут возвращать тот же экземпляр Bar
bean.
Это считается хорошей или плохой практикой? Кроме того, это будет зависеть от решаемой проблемы (в последнем примере я бы сказал, что это плохая практика). Большинство людей порекомендовали бы сконфигурировать все ваши bean-компоненты в одном месте (через XML или другое) и загрузить их одним контекстом приложения.