Spring MVC: настройка классов, контекста и сомнения в ComponentScans - PullRequest
0 голосов
/ 05 ноября 2018

Я переношу шаблон веб-приложения 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-компонента (по одному в каждом контексте)?

Есть ли еще контекст или поведение, которое я должен знать? Использую ли я "хорошую" структуру?

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...