Это две концепции, которые я иногда смешиваю — 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@ComponentScanpublic 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 Биджу Кунджуммена из блога « все и вся» . |