我正在将带有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 config和applicationContext not finding Controllers for Servlet context
这里有一些问题...
getRootConfigClasses方法(PersistenceConfig,WebSecurityConfig)下的所有类是否都使用根上下文?
getServletConfigClasses方法(WebMvcConfig)下的所有类是否都使用Web Servlet上下文?
侦听器(InitContextListener)是否也使用根上下文,过滤器是否使用Web servlet上下文?
如果对seame Bean进行了不同类(上下文)扫描,那么有2个不同的bean(每个上下文中一个)?
还有更多我应该知道的背景信息或行为吗?我使用的是“好”结构吗?
预先感谢