Статьи

Путаница в Spring WebApplicationInitializer и ApplicationContextInitializer

Это две концепции, которые я иногда смешиваю — WebApplicationInitializer и ApplicationContextInitializer, и я хотел описать каждую из них, чтобы прояснить их для себя.

Ранее я писал в блоге о WebApplicationInitializer здесь . Он имеет отношение только к сервлет-сервлету, соответствующему спецификации Servlet 3.0+, и предоставляет ловушку для программной настройки контекста сервлета. Как это помогает — вы можете создать веб-приложение без какого-либо файла web.xml, обычно используемого в веб-приложении на основе Spring для описания контекста корневого приложения и веб-контроллера Spring, называемого DispatcherServlet . Пример использования WebApplicationInitializer:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class CustomWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 @Override
 protected Class<?>[] getRootConfigClasses() {
  return new Class<?>[]{RootConfiguration.class};
 }
 
 @Override
 protected Class<?>[] getServletConfigClasses() {
  return new Class<?>[]{MvcConfiguration.class};
 }
 
 @Override
 protected String[] getServletMappings() {
  return new String[]{"/"};
 }
}

Теперь, что такое ApplicationContextInitializer . По сути, это код, который выполняется до того, как полностью создается контекст приложения Spring. Хорошим вариантом использования ApplicationContextInitializer было бы установить программный профиль среды Spring следующим образом:

1
2
3
4
5
6
7
8
9
public class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
 
 @Override
 public void initialize(ConfigurableApplicationContext ac) {
  ConfigurableEnvironment appEnvironment = ac.getEnvironment();
  appEnvironment.addActiveProfile("demo");
 
 }
}

Если у вас есть приложение на основе Spring-Boot, то зарегистрировать ApplicationContextInitializer довольно просто:

01
02
03
04
05
06
07
08
09
10
11
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class SampleWebApplication {
  
 public static void main(String[] args) {
  new SpringApplicationBuilder(SampleWebApplication.class)
    .initializers(new DemoApplicationContextInitializer())
    .run(args);
 }
}

Однако для не Spring-Boot Spring приложения это немного сложнее, если это программная конфигурация web.xml, то конфигурация такая:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class CustomWebAppInitializer implements WebApplicationInitializer {
 
 @Override
 public void onStartup(ServletContext container) {
  AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
  rootContext.register(RootConfiguration.class);
  ContextLoaderListener contextLoaderListener = new ContextLoaderListener(rootContext);
  container.addListener(contextLoaderListener);
  container.setInitParameter("contextInitializerClasses", "mvctest.web.DemoApplicationContextInitializer");
  AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
  webContext.register(MvcConfiguration.class);
  DispatcherServlet dispatcherServlet = new DispatcherServlet(webContext);
  ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", dispatcherServlet);
  dispatcher.addMapping("/");
 }
}

Если это обычная конфигурация web.xml, инициализатор можно указать так:

1
2
3
4
5
6
7
8
<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.myapp.spring.SpringContextProfileInit</param-value>
</context-param>
 
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Таким образом, чтобы заключить, за исключением суффикса Initializer, оба WebApplicationInitializer и ApplicationContextInitializer служат довольно различным целям. Принимая во внимание, что WebApplicationInitializer используется контейнером сервлетов при запуске веб-приложения и предоставляет способ программного создания веб-приложения (замена файла web.xml), ApplicationContextInitializer предоставляет ловушку для настройки контекста приложения Spring до его полного создания. ,

Ссылка: Путаница в Spring WebApplicationInitializer и ApplicationContextInitializer от нашего партнера по JCG Биджу Кунджуммена из блога « все и вся» .