我刚刚开始了一个新的春季项目,这次我想做“正确”的事情。在上一个项目中,由于多个@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
for@Configuration
和 for @Component
?
第二个问题是: 还是我应该简单地使用包来缩小扫描路径?
例子:
rootpackage
rootpackage.config.RootConfig
rootpackage.config.DatabaseConfig
rootpackage.mvc.WebMvcConfig
然后将所有@Controller
课程置于rootpackage.mvc.*
?
第三个问题是: let scan for更常见吗?或者我应该放在类的方法中?RootConfig
DatabaseConfig
DatabaseConfig
getRootConfigClasses
WebAppInitializer
最后一个问题是: 在一个多模块项目中:你如何组织这些东西?
示例:如果我选择我在问题二中描述的方式,我可以说,应用程序的每个模块实际上都由几个不同的模块组成。比方说,我想创建一个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
如果您建议这种方式,那么:在哪里放置模型和存储库(用于访问数据库)?我应该为每个模块创建一个新模块吗?
提前致谢!