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