Spring MVC:Config类,上下文和ComponentScans的疑问

时间:2018-11-05 10:25:43

标签: java spring spring-mvc

我正在将带有xml的Spring MVC webapp模板迁移到非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包添加到WebMvcConfig,则bean会重复。 无论如何,看来这是正确的配置,看起来Spring root and servlet context with Java configapplicationContext not finding Controllers for Servlet context

这里有一些问题...

getRootConfigClasses方法(PersistenceConfig,WebSecurityConfig)下的所有类是否都使用根上下文?

getServletConfigClasses方法(WebMvcConfig)下的所有类是否都使用Web Servlet上下文?

侦听器(InitContextListener)是否也使用根上下文,过滤器是否使用Web servlet上下文?

如果对seame Bean进行了不同类(上下文)扫描,那么有2个不同的bean(每个上下文中一个)?

还有更多我应该知道的背景信息或行为吗?我使用的是“好”结构吗?

预先感谢

0 个答案:

没有答案
相关问题