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