Я только что начал новый весенний проект, и на этот раз я хочу сделать все «правильно». В последнем проекте у меня были проблемы с многократной регистрацией определенных классов из-за нескольких аннотаций @ComponentScan
. (т.е. все классы обслуживания были зарегистрированы дважды)
В основном я использую следующий макет:
WebAppInitializer
:
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebMvcConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
RootConfig
:
@Configuration
@ComponentScan
public class RootConfig {
/* ... */
}
WebMvcConfig
:
@EnableWebMvc
@ComponentScan
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/* ... */
}
DatabaseConfig
:
@Configuration
@EnableJpaRepositories("my.base.class.path")
public class DataConfig {
/* ... */
}
Первый основной вопрос: Какой класс должен искать какие классы/аннотации?
Должен ли только WebMvcConfig
сканировать @Controller
классы? Какой из них должен сканировать @Service
, @Configuration
и @Component
?
Второй вопрос: Или мне просто использовать пакеты, чтобы сузить путь сканирования?
Пример:
rootpackage
rootpackage.config.RootConfig
rootpackage.config.DatabaseConfig
rootpackage.mvc.WebMvcConfig
а затем поместить все @Controller
классы под rootpackage.mvc.*
?
Третий вопрос: чаще разрешают RootConfig
сканировать DatabaseConfig
? Или мне следует поместить DatabaseConfig
в метод getRootConfigClasses
класса WebAppInitializer
?
Последний вопрос: В многомодульном проекте: как организовать все это?
Пример. Если бы я выбрал способ, описанный во втором вопросе, я мог бы сказать, что каждый модуль приложения на самом деле будет состоять из нескольких разных модулей. Допустим, я хочу создать модуль X
, в котором будет класс @Service
и несколько классов @Controller
, я мог бы поместить их в них в разных пакетах. Как это:
Maven Module X Service
rootpackage.services.x.XService
rootpackage.services.x.XServiceImpl
Maven Module X Controller
rootpackage.mvc.controller.x.X1Controller
rootpackage.mvc.controller.x.X2Controller
rootpackage.mvc.controller.x.X3Controller
А если предложить такой способ, то: Где размещать модели и репозитории (для доступа к БД)? Должен ли я создавать новый модуль для каждого из них?
Заранее спасибо!