Рубрики
Без рубрики

Spring ApplicationContext

Узнайте об интерфейсе ApplicationContext в Spring и о том, как настроить компоненты в некоторых наиболее распространенных типах ApplicationContext.

Автор оригинала: Kamlesh Kumar.

1. Обзор

В этом уроке мы подробно рассмотрим интерфейс Spring Applicationcontext .

2. Интерфейс ApplicationContext

Одной из основных особенностей пружинного каркаса является контейнер IoC (Инверсия управления). Контейнер Spring IoC отвечает за управление объектами приложения. Он использует инъекцию зависимостей для достижения инверсии управления.

Интерфейсы BeanFactory и ApplicationContext представляют контейнер Spring IoC . Здесь BeanFactory является корневым интерфейсом для доступа к контейнеру Spring. Он предоставляет основные функциональные возможности для управления бобами.

С другой стороны, ApplicationContext является подинтерфейсом BeanFactory . Следовательно, он предлагает все функции BeanFactory.

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

3. Что такое Весенняя Фасоль?

Прежде чем мы углубимся в контейнер ApplicationContext , важно знать о весенних бобах. В Spring bean – это объект, который контейнер Spring создает, собирает и управляет .

Итак, должны ли мы настроить все объекты нашего приложения как Spring beans? Ну, как лучшая практика, мы не должны этого делать.

Согласно документации Spring , в общем случае мы должны определить компоненты для объектов уровня обслуживания, объектов доступа к данным (DAO), объектов представления, объектов инфраструктуры, таких как Hibernate SessionFactories, Очереди JMS и так далее.

Кроме того, как правило, мы не должны настраивать мелкозернистые объекты домена в контейнере. Обычно ответственность за создание и загрузку объектов домена лежит на DAO и бизнес-логике.

Итак, давайте определим простой класс Java, который мы будем использовать в качестве компонента Spring в этом уроке:

public class AccountService {

  @Autowired
  private AccountRepository accountRepository;

  // getters and setters
}

4. Настройка бобов в контейнере

Как мы знаем, основная задача ApplicationContext заключается в управлении бобами.

Таким образом, приложение должно предоставить конфигурацию компонента контейнеру ApplicationContext . Таким образом, конфигурация компонента Spring состоит из одного или нескольких определений компонента. Кроме того, Spring поддерживает различные способы настройки компонентов.

4.1. Конфигурация на основе Java

Во-первых, мы начнем с конфигурации на основе Java, поскольку это самый новый и наиболее предпочтительный способ настройки компонентов. Он доступен с весны 3.0 и далее.

Конфигурация Java обычно использует @Bean -аннотированные методы в классе @Configuration . Аннотация @Bean в методе указывает, что метод создает пружинный компонент. Кроме того, класс с аннотацией @Configuration указывает, что он содержит конфигурации компонентов Spring.

Итак, давайте теперь создадим класс конфигурации, чтобы определить наш Account Service класс как Spring bean:

@Configuration
public class AccountConfig {

  @Bean
  public AccountService accountService() {
    return new AccountService(accountRepository());
  }

  @Bean
  public AccountRepository accountRepository() {
    return new AccountRepository();
  }
}

4.2. Конфигурация на основе аннотаций

Spring 2.5 представила конфигурацию на основе аннотаций в качестве первого шага для включения конфигураций компонентов в Java.

В этом подходе мы сначала включаем конфигурацию на основе аннотаций с помощью конфигурации XML. Затем мы используем набор аннотаций к нашим классам Java, методам, конструкторам или полям для настройки компонентов. Некоторые примеры этих аннотаций: @Component , @Controller , @Service , @Repository , @Autowired и @Qualifier .

Примечательно, что мы также используем эти аннотации с конфигурацией на основе Java. Кроме того, Spring продолжает добавлять новые возможности к этим аннотациям с каждым выпуском.

Итак, теперь давайте рассмотрим простой пример этой конфигурации.

Сначала мы создадим конфигурацию XML, user-bean-config.xml , чтобы включить аннотации:



  
  
  

Здесь тег annotation-config включает сопоставления на основе аннотаций . Кроме того, тег component-scan указывает Spring, где искать аннотированные классы.

Во-вторых, мы создадим класс User Service и определим его как Spring bean, используя аннотацию @Component :

@Component
public class UserService {
  // user service code
}

А затем мы напишем простой тестовый случай для проверки этой конфигурации:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/user-bean-config.xml");
UserService userService = context.getBean(UserService.class);
assertNotNull(userService);

4.3. Конфигурация на основе XML

Наконец, давайте рассмотрим конфигурацию на основе XML. Это традиционный способ настройки бобов весной.

Очевидно, что при таком подходе мы выполняем все сопоставления bean в файле конфигурации XML .

Итак, давайте создадим файл конфигурации XML, account-bean-config.xml , и определить компоненты для нашего AccountService класса:



	  
  
    
  
	
  

5. Типы ApplicationContext

Spring предоставляет различные типы ApplicationContext контейнеров, подходящих для различных требований. Это реализации интерфейса ApplicationContext . Итак, давайте рассмотрим некоторые из распространенных типов ApplicationContext .

5.1. Аннотацияconfigapplicationcontext

Во-первых, давайте посмотрим класс AnnotationConfigApplicationContext , который был представлен весной 3.0. Он может принимать классы, аннотированные @Configuration , @Component , и метаданные JSR-330 в качестве входных данных.

Итак, давайте рассмотрим простой пример использования контейнера AnnotationConfigApplicationContext с нашей конфигурацией на основе Java:

ApplicationContext context = new AnnotationConfigApplicationContext(AccountConfig.class);
AccountService accountService = context.getBean(AccountService.class);

5.2. аннотацияconfigwebapplicationcontext

AnnotationConfigWebApplicationContext является веб-вариантом |/AnnotationConfigApplicationContext .

Мы можем использовать этот класс при настройке прослушивателя Spring ContextLoaderListener servlet или Spring MVC DispatcherServlet в web.xml файл.

Кроме того, начиная с Spring 3.0 и далее, мы также можем программно настроить этот контейнер контекста приложения. Все, что нам нужно сделать, это реализовать интерфейс WebApplicationInitializer :

public class MyWebApplicationInitializer implements WebApplicationInitializer {

  public void onStartup(ServletContext container) throws ServletException {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(AccountConfig.class);
    context.setServletContext(container);

    // servlet configuration
  }
}

5.3. XmlWebApplicationContext

Если мы используем конфигурацию на основе XML в веб-приложении , мы можем использовать класс XmlWebApplicationContext .

На самом деле настройка этого контейнера похожа только на класс AnnotationConfigWebApplicationContext , что означает, что мы можем настроить его в web.xml или реализовать интерфейс WebApplicationInitializer :

public class MyXmlWebApplicationInitializer implements WebApplicationInitializer {

  public void onStartup(ServletContext container) throws ServletException {
    XmlWebApplicationContext context = new XmlWebApplicationContext();
    context.setConfigLocation("/WEB-INF/spring/applicationContext.xml");
    context.setServletContext(container);

    // Servlet configuration
  }
}

5.4. Файловая система xmlapplicationcontext

Мы используем класс FileSystemXMLApplicationContext для загрузки файла конфигурации Spring на основе XML из файловой системы или из URL-адресов. Этот класс полезен, когда нам нужно загрузить ApplicationContext программно. В общем, тестовые жгуты и автономные приложения-вот некоторые из возможных вариантов использования для этого.

Например, давайте посмотрим, как мы можем создать этот контейнер Spring и загрузить компоненты для нашей конфигурации на основе XML:

String path = "C:/myProject/src/main/resources/applicationcontext/account-bean-config.xml";

ApplicationContext context = new FileSystemXmlApplicationContext(path);
AccountService accountService = context.getBean("accountService", AccountService.class);

5.5. ClassPathXmlApplicationContext

В случае, если мы хотим загрузить файл конфигурации XML из пути к классу , мы можем использовать класс ClassPathXmlApplicationContext|/. Подобно FileSystemXMLApplicationContext, он полезен для тестовых жгутов, а также для контекстов приложений, встроенных в банки.

Итак, давайте рассмотрим пример использования этого класса:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/account-bean-config.xml");
AccountService accountService = context.getBean("accountService", AccountService.class);

6. Дополнительные возможности ApplicationContext

6.1. Разрешение сообщений

ApplicationContext интерфейс поддерживает разрешение сообщений и интернационализацию путем расширения MessageSource интерфейса . Кроме того, Spring предоставляет две реализации MessageSource , ResourceBundleMessageSource | и StaticMessageSource .

Мы можем использовать StaticMessageSource для программного добавления сообщений в источник. Однако он поддерживает базовую интернационализацию и больше подходит для тестов, чем для производственного использования.

С другой стороны, ResourceBundleMessageSource является наиболее распространенной реализацией Источника сообщений . Он опирается на базовую реализацию Resource Bundle JDK. Он также использует стандартный анализ сообщений JDK, предоставляемый форматом Message .

Теперь давайте посмотрим, как мы можем использовать Источник сообщений для чтения сообщений из файла свойств.

Сначала мы создадим файл messages.properties в пути к классу:

account.name=TestAccount

Во-вторых, мы добавим определение компонента в наш класс Account Config :

@Bean
public MessageSource messageSource() {
  ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
  messageSource.setBasename("config/messages");
  return messageSource;
}

В-третьих, мы введем MessageSource в службу учетных записей :

@Autowired
private MessageSource messageSource;

Наконец, мы можем использовать метод GetMessage в любом месте службы Account для чтения сообщения:

messageSource.getMessage("account.name", null, Locale.ENGLISH);

Spring также предоставляет класс ReloadableResourceBundleMessageSource , который позволяет считывать файлы из любого расположения ресурсов Spring и поддерживает горячую перезагрузку файлов свойств пакета.

6.2. Обработка событий

ApplicationContext поддерживает обработку событий с помощью класса ApplicationEvent и интерфейса ApplicationListener . Он поддерживает встроенные события , такие как ContextStartedEvent , ContextStoppedEvent , ContextClosedEvent и RequestHandledEvent . Кроме того, он также поддерживает пользовательские события для бизнес-случаев использования.

7. Заключение

В этом уроке мы обсудили различные аспекты контейнера ApplicationContext весной. Мы видели различные примеры того, как настроить компоненты Spring в Applicationcontext . Кроме того, мы видели, как создавать и использовать различные типы ApplicationContext .

Как всегда, полный код доступен на GitHub .