Контекст приложения. Что это?

Мои коллеги очень часто используют слово "контекст приложения". Во многих статьях это коллокация использовалась очень часто.

Мое текущее понимание: контекст приложения - это один xml файл.

Но я понимаю, что если бы я был прав, люди не использовали бы "контекст приложения" вместо файла конфигурации xml.

Можете ли вы помочь мне решить эту проблему?

Ответы

Ответ 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 или другое) и загрузить их одним контекстом приложения.

Ответ 2

Я предполагаю, что ваши коллеги означали загруженный контекст приложения spring, который позволяет получить доступ к:

  • конфигурация приложения,
  • инициализирован beans,
  • события приложения api,
  • и т.д.