SpringMVC註解版:讀取核心配置類

有的時候真心不喜歡這個世界!!!html

第一步:Servlet容器的初始化

按照以前傳統的方式來配置SpringMVC須要在web.xml中配置DispatcherServlet,可是在Servlet3規範和Spring3.1以後新增了一種方式,那就是java和註解的方式進行配置,今天咱們以Spring的最新版本5.2.1.RELEASE來進行一下配置,一塊兒來看一下吧!前端

mvc-context-hierarchy.png

在Web MVC框架中,每一個DispatcherServlet都有本身的WebApplicationContext,它繼承了在根WebApplicationContext中已經定義的全部bean。 根WebApplicationContext應該包含應在其餘上下文和Servlet實例之間共享的全部基礎結構Bean。 這些繼承的bean能夠在servlet特定的做用域中被覆蓋,而且您能夠在給定Servlet實例本地定義新的特定於做用域的bean。
複製代碼

下面的配置來自域官方文檔:java

取消web.xml改用java來配置首先須要有一個入口,下面展現了這個入口,即先建立一個初始化的類GolfingWebAppInitializer ,GolfingWebAppInitializer 類繼承了一個名爲AbstractAnnotationConfigDispatcherServletInitializer的抽象類,一樣這個抽象類實現了org.springframework.web.WebApplicationInitializer接口。
複製代碼
public class GolfingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        // GolfingAppConfig defines beans that would be in root-context.xml
        return new Class[] { GolfingAppConfig.class };//Spring框架的核心配置文件
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // GolfingWebConfig defines beans that would be in golfing-servlet.xml
        return new Class[] { GolfingWebConfig.class };//Spring MVC框架的核心配置文件
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}
複製代碼
  • 繼承AbstractAnnotationConfigDispatcherServletInitializer須要實現三個方法,其中getServletMappings()會返回一個路徑數組,將一個或多個路徑映射到DispatcherServlet上,本例中它映射的是「/」,表示DispatcherServlet會處理全部的請求。web

  • getServletConfigClasses()方法要返回一個帶有@Configuration註解的類,這個類將會用來定義DispatcherServlet應用上下文。spring

  • getRootConfigClasses()方法要返回一個帶有@Configuration註解的類,這個類將會用來配置原來xml中ContextLoaderListener所建立的應用上下文。api

啓動原理:數組

在Servlet3.0環境中容器會查找類路徑下的實現了javax.servlet.ServletContainerInitializer接口的類,找到了就會用它來配置Servlet容器。從這個接口的全限定名稱上能夠看出它是java標準api的一部分,是在Servlet 3.0之後才添加的。Spring爲這個接口提供了一個實現類:bash

package org.springframework.web;

@HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {
    public SpringServletContainerInitializer() {}
}
複製代碼

這個實現類又會把配置任務交給WebApplicationInitializer接口的實現類來完成。咱們這裏實現的抽象類AbstractAnnotationConfigDispatcherServletInitializer正是WebApplicationInitializer的一個實現類。而咱們的GolfingWebAppInitializer正是AbstractAnnotationConfigDispatcherServletInitializer的一個擴展,因此這樣就把配置任務最終交給了咱們自定義的這個配置類GolfingWebAppInitializer。mvc


第二步:SpringMVC配置

package com.os;

import com.os.config.SpringMvcConfigurer;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class GolfingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{
            SpringMvcConfigurer.class/*這個就是SpringMVC的核心配置文件,至關於以前配置果的xml*/
        };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };//映射的路徑
    }
}
複製代碼

SpringMvcConfigurerapp

package com.os.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan(basePackages = "com.os.**.web")
public class SpringMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();
        jspViewResolver.setPrefix("/WEB-INF/jsp/");
        jspViewResolver.setSuffix((".jsp"));

        registry.viewResolver(jspViewResolver);
    }
}
複製代碼

WebMvcConfigurer提供了回調方法來供咱們自定義SpringMVC的默認配置。若是是使用@EnableWebMvc註解的話表示啓用WebMvcConfigurationSupport類的默認配置。咱們並無使用@EnableWebMvc註解而是實現了WebMvcConfigurer,這樣作是爲了擴展。

第三步:編寫Controller

package com.os.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class IndexController {
    @GetMapping("/add")
    public String add(){
        return "add";
    }
}
複製代碼

Snap1.jpg

基本上就搞定了!發佈一下項目就好了,這裏沒有使用Tomcat插件的形式進行發佈,仍是使用原始的發佈方式,這裏就不過多說明和配置了,這些東西仍是比較簡單的!上述配置和加載SpringMVC的核心配置文件的方式是咱們推薦的方式,可是還有一種能夠讀取前端控制器的方式,這裏簡單的記錄一下!

附錄

package com.hanpang.config;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class HelloWorldInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup( ServletContext application ) throws ServletException {
		System.out.println("開始加載容器");
		AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
		ctx.register(SpringMvcConfiguration.class);//核心類
		ctx.setServletContext(application);

		ServletRegistration.Dynamic servlet = application.addServlet("dispatcher", new DispatcherServlet(ctx));

		servlet.setLoadOnStartup(2);
		servlet.addMapping("/");

	}

}
複製代碼
相關文章
相關標籤/搜索