【发布时间】:2015-04-02 07:45:48
【问题描述】:
我在 Servlet 3.0+ 环境中运行 Spring 应用程序,以使用所有 Java 配置以编程方式配置 servlet 上下文。我的问题(详情如下):如何构建一个项目以支持对根应用程序上下文和 Web 应用程序上下文的组件扫描,而无需重复组件初始化?
据我了解,注册 Spring bean 有两种上下文。首先,根上下文是非 servlet 相关组件所在的位置。例如批处理作业、DAO 等。其次,servlet 上下文是与 servlet 相关的组件所在的位置,例如控制器、过滤器等。
我已经实现了一个 WebApplicationInitializer 来注册这两个上下文,就像 WebApplicationInitializer 中的 JavaDoc 使用 AppConfig.class 和 DispatcherConfig.class 指定的那样。
我希望两者都能自动找到它们各自的组件,因此我已将 @ComponentScan 添加到两者(这导致我的 Hibernate 实体被启动两次)。 Spring 通过扫描一些指定的基本包来找到这些组件。这是否意味着我需要将所有与 DAO 相关的对象与控制器放在一个单独的包中?如果是这样,那会很不方便,因为我通常喜欢按功能(而不是类型)打包。
代码 sn-ps...
WebApplicationInitializer:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws ServletException {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class);
// Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));
// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext =
new AnnotationConfigWebApplicationContext();
dispatcherContext.register(WebAppConfig.class);
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
应用配置:
@Configuration
@ComponentScan
public class AppConfig {
}
WebAppConfig:
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@ComponentScan(basePackageClasses = AppConfig.class)
public class WebAppConfig extends WebMvcConfigurerAdapter {
}
【问题讨论】:
标签: spring spring-mvc