SpringMVC的Java Config

摘要

MAVEN的配置细节

因为我们使用Java Config来代替web.xml配置文件,所以需要修改一下maven-war-plugin的配置,避免因为其找到不web.xml文件而报错。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <!--忽略对web.xml文件的检查-->
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

Spring MVC的Java Config

web.xml的Java Config

  • 第一种方式,实现WebApplicationInitializer接口
@ComponentScan
@Configuration
@EnableWebMvc // 启用MVC Java config的支持. 相当于 <mvc:annotation-driven/>
public class WebAppConfig {
}
/**
 * 实现WebApplicationInitializer 接口中的onStartup 方法
 * <p>
 * 该类就相当于 web.xml 文件
 */
public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        /**
            下面的代码,等价于 :
         <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
         </servlet>
         */
        //1. 创建 AnnotationConfigWebApplicationContext
        AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
        //用来加载所有的Bean
        webApplicationContext.register(WebAppConfig.class);
        webApplicationContext.setServletContext(servletContext);

        //2. 创建 DispatcherServlet
        ServletRegistration.Dynamic dispatcherServlet =
                // 通过DispatcherServlet来创建web 相关 Bean,所以传入webApplicationContext对象
                servletContext.addServlet("dispatcherServlet", new DispatcherServlet(webApplicationContext));

        /**
            下面的代码,等价于
         <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
         </servlet-mapping>
         */
        dispatcherServlet.addMapping("/");

        dispatcherServlet.setLoadOnStartup(1);

        //3. 注册filter
        FilterRegistration.Dynamic characterEncoding =
                servletContext.addFilter("characterEncoding", new CharacterEncodingFilter("utf-8", true));
        characterEncoding.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "dispatcherServlet");
    }
}
  • 第二种方式,继承AbstractAnnotationConfigDispatcherServletInitializer 推荐使用这种方式
@ComponentScan
@Configuration
@EnableWebMvc // 启用MVC Java config的支持. 相当于 <mvc:annotation-driven/>
public class WebAppConfig {
}
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * ContextLoaderListener创建的应用上下文中的Bean的配置文件
     * 也就是Spring的主配置文件
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{Config.class};
    }

    /**
     * DispatcherServlet应用上下文相关的Bean的配置文件
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebAppConfig.class};
    }

    /**
     * 将一个或者多种路径映射到DispatcherServlet
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

注册自定义Servlet,Filter和Linstener

  • 第一种方式,可以使用Servlet3.0的相关注解,例如@WebFilter
  • 第二种方式,可以通过实现Spring的WebApplicationInitializer接口,在该接口的方法中,注册相关Servlet,Filter和Linstener
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,408评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,055评论 6 342
  • 本文从API角度入手,带你了解SpringMVC启动的原理。 ServletContainerInitialize...
    南桥畂翊阅读 11,159评论 1 14
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,935评论 18 399
  • 临近父亲节,我仍在外地求学。按照孔子说的,父母在不远游……我是不一样的。 我的老爸是我心中的英雄。 我老爸不善言辞...
    菠萝蜜有毒阅读 923评论 0 0