Я переношу шаблон веб-приложения Spring MVC с xml в конфигурацию, отличную от xml, и у меня есть некоторые сомнения относительно того, что сканировать в каждом классе.
Это мои основные классы конфигурации
AppInitializer.java
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { PersistenceConfig.class, WebSecurityConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebMvcConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
public void onStartup(ServletContext container) throws ServletException {
super.onStartup(container);
container.addListener(InitContextListener.class);
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF8");
filter.setForceEncoding(true);
Filter[] filters = new Filter[1];
filters[0] = filter;
return filters;
}
}
PersistenceConfig.java
@Configuration
@EnableTransactionManagement
@ComponentScans(value = {
@ComponentScan("net.myapp.service"),
@ComponentScan("net.myapp.dao"),
@ComponentScan("net.myapp.rest")
})
public class PersistenceConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("net.myapp.model");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibernateProperties());
return em;
}
...
WebMvcConfig.java
@Configuration
@EnableWebMvc
@ComponentScans(value = {
@ComponentScan("net.myapp.controller")
})
public class WebMvcConfig implements WebMvcConfigurer {
...
Это единственный способ, которым я обнаружил, что Componenscans работает правильно. Если я добавлю пакет dao или service в bean-компоненты WebMvcConfig, они будут дублированы.
В любом случае, похоже, что это правильная конфигурация: контекст root и сервлета Spring с конфигурацией Java и applicationContext не находит контроллеры для контекста сервлета
Вот некоторые вопросы ...
Все ли выражения в методе getRootConfigClasses (PersistenceConfig, WebSecurityConfig) используют корневой контекст?
Все ли выражения в методе getServletConfigClasses (WebMvcConfig) используют контекст веб-сервлета?
Слушатели (InitContextListener) также используют корневой контекст, а фильтры используют контекст веб-сервлета?
Если bean-компонент seame сканируется в разных классах (контексте), то существует 2 разных bean-компонента (по одному в каждом контексте)?
Есть ли еще контекст или поведение, которое я должен знать? Использую ли я "хорошую" структуру?
Заранее спасибо