【发布时间】:2014-02-02 01:44:47
【问题描述】:
我刚刚开始了一个新的春季项目,这次我想做“正确”的事情。在上一个项目中,由于多个 @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 放在WebAppInitializer 类的getRootConfigClasses 方法中?
最后一个问题是: 在一个多模块项目中:你如何组织这些东西?
示例:如果我选择我在问题二中描述的方式,我可以说,应用程序的每个模块实际上都由几个不同的模块组成。比方说,我想创建一个模块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
如果您建议采用这种方式,那么:在哪里放置模型和存储库(用于访问数据库)?我应该为每个模块创建一个新模块吗?
提前致谢!
【问题讨论】:
标签: spring maven spring-mvc multi-module spring-java-config