纯 Java SpringMVC 配置

在上一节中我们去掉了 web.xml,通过 Java 代码实现了 Servlet 的配置,然而 SpringMVC 本身的配置文件 MyFirstServletName-servlet.xml 依然存在,下面我们看一下如何进一步将它也去掉。

首先我们需要使用 AnnotationConfigWebApplicationContext 去初始化 DispatcherServlet

  1. public class MyWebApplicationInitializer implements WebApplicationInitializer {
  2. @Override
  3. public void onStartup(ServletContext container) {
  4. AnnotationConfigWebApplicationContext context
  5. = new AnnotationConfigWebApplicationContext();
  6. context.setConfigLocation("com.skyline.AppConfig");
  7. ServletRegistration.Dynamic registration = container.addServlet("MyFirstServletName", new DispatcherServlet(context));
  8. registration.setLoadOnStartup(1);
  9. registration.addMapping("/");
  10. }
  11. }

还记得 SpringIoC 中的 Context 概念吗?AnnotationConfigWebApplicationContext 也是一个 Context 的例子,只不过这里的 Context 加入了和 Web 有关的内容。

注意上面我们设置了配置为 com.skyline.AppConfig,下面修改 AppConfig

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public Object myFirstSpringController() {
  5. return new MyFirstSpringController();
  6. }
  7. }

这时候我们删除 Tomcat 目录下的 MyFirstServletName-servlet.xml,运行程序,依然可以通过浏览器访问看到 “Hello, SpringMVC.” 的结果。

@Controller 也是继承自 @Component,因此我们可以使用 Component Scan 功能来简化代码:

  1. @Configuration
  2. @ComponentScan("com.skyline")
  3. public class AppConfig {
  4. }

为了进一步简化 Java 配置的过程,Spring 还提供了一个名为 AbstractAnnotationConfigDispatcherServletInitializer 的类。修改我们的 MyWebApplicationInitializer

  1. public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  2. @Override
  3. protected Class<?>[] getRootConfigClasses() {
  4. return new Class[] { };
  5. }
  6. @Override
  7. protected Class<?>[] getServletConfigClasses() {
  8. return new Class[] { AppConfig.class };
  9. }
  10. @Override
  11. protected String[] getServletMappings() {
  12. return new String[] { "/*" };
  13. }
  14. }

可以看到这种方法更加直接和明了。

注意上面有一个 getRootConfigClasses 我们返回了空数组。getServletConfigClasses 用于创建当前 DispatcherServlet 的 WebApplicationContext,在此基础上,Spring 还允许若干 DispatcherServlet 共享一个 Root WebApplicationContext。Root WebApplicationContext 中可以配置跨 Servlet 共享的业务逻辑等,getRootConfigClasses 就是用来提供创建 Root WebApplicationContext 的。