Я запускаю приложение Spring в среде Servlet 3.0+, чтобы программно настроить контекст сервлета, используя всю конфигурацию Java. Мой вопрос (с подробными сведениями ниже): как структурирован проект для поддержки сканирования компонентов как для контекста root, так и для веб-приложений без дублирования инициализации компонента?Контекст корня корня и сервлета с конфигурацией Java
Как я понимаю, существуют два контекста, в которых можно зарегистрировать весенние бобы. Во-первых, корневой контекст - это компоненты, не связанные с сервлетом. Например, пакетные задания, DAO и т. Д. Во-вторых, контекст сервлета - это компоненты, связанные с сервлетом, такие как контроллеры, фильтры и т. Д.
Я внедрил WebApplicationInitializer, чтобы зарегистрировать эти два контекста так же, как JavaDoc в WebApplicationInitializer указывает с AppConfig.class и DispatcherConfig.class.
Я хочу, чтобы оба автоматически находили свои соответствующие компоненты, поэтому я добавил @ComponentScan для обоих (что приводит к тому, что мои объекты Hibernate инициируются дважды). Spring находит эти компоненты, сканируя некоторые определенные базовые пакеты. Означает ли это, что мне нужно поместить все объекты, связанные с DAO, в отдельный пакет с контроллеров? Если это так, это будет довольно неудобно, поскольку я обычно предпочитаю упаковывать по функциональности (в отличие от типа).
Фрагменты кода ...
WebApplicationInitializer:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws ServletException {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class);
// Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));
// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext =
new AnnotationConfigWebApplicationContext();
dispatcherContext.register(WebAppConfig.class);
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
AppConfig:
@Configuration
@ComponentScan
public class AppConfig {
}
WebAppConfig:
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@ComponentScan(basePackageClasses = AppConfig.class)
public class WebAppConfig extends WebMvcConfigurerAdapter {
}
Огромное спасибо за то, что это решает проблему упаковки по функциональности! – Corey
AppConfig: @ComponentScan ( excludeFilters = {@ ComponentScan.Filter (Controller.class)} ) – Corey
WebAppConfig: @ComponentScan ( basePackageClasses = AppConfig.class , useDefaultFilters = ложь , includeFilters = {@ ComponentScan.Filter (Controller.class)} ) – Corey