注解方式整合SpringMVC

一、整合SpringMVC分析

web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer文件,加载这个文件里面指定的类SpringServletContainerInitializer
在这里插入图片描述
spring的应用一启动就会加载WebApplicationInitializer接口下的所有组件并创建对象
在这里插入图片描述
WebApplicationInitializer接口下有三个抽象类
在这里插入图片描述

AbstractContextLoaderInitializer抽象类:

调用createRootApplicationContext()方法来创建根容器
在这里插入图片描述

AbstractDispatcherServletInitializer抽象类

调用createServletApplicationContext()方法创建一个web的IOC容器

调用createDispatcherServlet()方法创建了DispatchServlet

将创建的DispatchServlet添加到ServletContext

在这里插入图片描述

AbstractAnnotationConfigDispatcherServletInitializer抽象类

使用注解的方式配置的DispatcherServlet初始化器

该类重写AbstractContextLoaderInitializer父类的createRootApplicationContext()方法来创建根容器。调用getRootConfigClasses()方法传入一个配置类
在这里插入图片描述
该类还重写了AbstractDispatcherServletInitializer父类的createServletApplicationContext()方法来创建web的IOC容器。获取配置类注册到IOC容器中。
在这里插入图片描述

以注解方式来启动SpringMVC,需要继承AbstractAnnotationConfigDispatcherServletInitializer,然后实现抽象方法指定DispatcherServlet的配置信息

二、注解方式整合SpringMVC

自定义容器初始化器

/*web容器启动的时候创建对象,调用方法来初始化容器以及前端控制器*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /*获取根容器的配置类,相当于Spring的配置文件,用来创建父容器*/
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }

    /*获取web容器的配置类,相当于SpringMVC的配置文件,用来创建子容器*/
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{AppConfig.class};
    }

    /*获取DispatcherServlet的映射信息*/
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

子容器配置类

//SpringMVC只扫描Controller,子容器
@ComponentScan(value = "springMVC", includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})
public class AppConfig {
}

父容器配置类

//Spring的容器不扫描Controller,必须禁用默认的过滤规则才会生效,父容器
@ComponentScan(value = "springMVC", excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
public class RootConfig {
}

Service

@Service
public class HelloService {

    public String sayHello(String name){
        return "hello " + name;
    }
}

Controller

@Controller
public class HelloController {

    @Autowired
    HelloService helloService;

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        String hello = helloService.sayHello("张三");

        return hello;
    }
}

三、定制SpringMVC

使用@EnableWebMvc开启SpringMVC定制配置功能,相当于在xml文件中使用<mvc:annotation-driven/>标签

@ComponentScan(value = {"controller", "service", "config", "springMVC"}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig {
}

配置组件,包括视图解析器、视图映射、静态资源映射、拦截器等等

@ComponentScan(value = {"controller", "service", "config", "springMVC"}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter{

    //定制视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    //定制静态资源访问
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        /*相当于在xml配置文件中使用<mvc:default-servlet-handler>标签,
        * 将SpringMVC处理不了的请求交给Tomcat,这样静态资源就可以访问了*/
        configurer.enable();
    }

    //定制拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值