SpringMVC 注解配置

参考

  • Spring in Action(4th Edition)

不使用web.xml配置DispatchServlet

在Servlet 3.0以上环境, 容器会在classpath寻找实现了javax.servlet .ServletContainerInitializer接口的类. 如果找到了, 那么会用于配置该Servlet容器.

Spring提供了一个实现了该接口的类SpringServlet-ContainerInitializer. Spring的这个类会寻找任何实现了Web- ApplicationInitializer接口的类, 并将配置工作转交给它. Spring 3.2 加入了一个方便的基本实现类AbstractAnnotationConfigDispatcherServletInitializer. 那么我们只需要写一个类继承于该类, 那么将程序部署到Servlet 3.0容器的时候, 将会被自动发现而且用于配置servlet context.

实例

SpittrWebAppInitializer.java

  • getRootConfigClasses()
    其实就是对应ApplicationContext.xml, 配置了整个程序通用的beans.
  • getServletConfigClasses()
    其实就是对应SpringMVC的xml配置, 配置了Controller这些.
  • getServletMappings()
    其实就是对应DispatcherServlet的
package me.xiaofud.spring101.spittr.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * Created by xiaofu on 17-11-11.
 */
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }

    protected Class[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    protected String[] getServletMappings() {
        // mapping for DispatcherServlet
        return new String[]{"/app/*"};
//        return new String[]{"/"};
    }
}

RootConfig.java

package me.xiaofud.spring101.spittr.config;

import org.springframework.context.annotation.Configuration;

/**
 * Created by xiaofu on 17-11-11.
 * As application context
 */
@Configuration
@ComponentScan
public class RootConfig {

}

WebConfig.java
理解@EableWebMvc注解:

  • Stackoverflow - enablewebmvc-annotation-meaning
  • Spring MVC - Importing configurations with @EnableWebMvc
  • hahalq - Spring mvc注解配置的背后

@EableWebMvc 等价于 xml 文件中的 .
使用该注解其实是导入了WebMvcConfigurationSupport, 以其作为基本的配置文件, 即会导入一些很常用的bean.

package me.xiaofud.spring101.spittr.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * Created by xiaofu on 17-11-11.
 * As springmvc context
 */
@Configuration
@EnableWebMvc
@ComponentScan("me.xiaofud.spring101.spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resourceViewResolver = new InternalResourceViewResolver();
        resourceViewResolver.setPrefix("/WEB-INF/views/");
        resourceViewResolver.setSuffix(".jsp");
        resourceViewResolver.setExposeContextBeansAsAttributes(true);
        return resourceViewResolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // configure static content handling
        configurer.enable();
    }
}

部署到Tomcat后的输出:

12-Nov-2017 17:07:27.112 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.prepareRefresh Refreshing Root WebApplicationContext: startup date [Sun Nov 12 17:07:27 CST 2017]; root of context hierarchy
12-Nov-2017 17:07:27.164 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions Registering annotated classes: [class me.xiaofud.spring101.spittr.config.RootConfig]
12-Nov-2017 17:07:27.497 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext: initialization completed in 400 ms
12-Nov-2017 17:07:27.536 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.DispatcherServlet.initServletBean FrameworkServlet 'dispatcher': initialization started
12-Nov-2017 17:07:27.540 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.prepareRefresh Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun Nov 12 17:07:27 CST 2017]; parent: Root WebApplicationContext
12-Nov-2017 17:07:27.542 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions Registering annotated classes: [class me.xiaofud.spring101.spittr.config.WebConfig]

你可能感兴趣的:(SpringMVC 注解配置)