Я новичок в конфигурации Spring Java, и мне что-то интересно.
Традиционно веб-приложения Spring имели 2 разных контекста: контекст корневого приложения и контекст сервлета диспетчера. Корневой контекст содержит в основном все, вплоть до сервисного уровня (конфигурация персистентности, такая как JPA и уровень доступа к данным), и контекст сервлета, содержащий все MVC и другие вещи, связанные с сетью.
Веб-контекст наследуется от корневого контекста, поэтому веб-компоненты имеют доступ к компонентам в корневом контексте, но не наоборот.
С современным подходом, использующим конфигурацию без XML и org.springframework.web.WebApplicationInitializer
, имеет ли смысл иметь 2 разных контекста?
Казалось бы, проще иметь несколько аннотированных классов @Configuration
, перегруппировывающих bean-компоненты по уровням (например, один для уровня доступа к данным, один для сервисного уровня, один для веб-слоя) и загружать их все в одном контексте, например:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherServletContext = new AnnotationConfigWebApplicationContext();
dispatcherServletContext.register(MyPersistenceConfig.class, MyServicesConfig.class, MyMvcConfig.class);
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServletContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Однако я видел примеры, когда корневой контекст все еще создается, а его жизненный цикл управляется с помощью org.springframework.web.context.ContextLoaderListener
, например:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(MyPersistenceConfig.class, MyServicesConfig.class);
// Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));
// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherServletContext = new AnnotationConfigWebApplicationContext();
dispatcherServletContext.register(MyMvcConfig.class);
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServletContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Для простого веб-приложения (один модуль maven) дает ли второй подход какие-либо конкретные преимущества, которые уравновешивают дополнительную сложность? Какова наилучшая практика?