SpringMVC源码深度解析(⼀):纯注解版SpringMVC
前⾔
前后端分离以及Springboot⼤⾏其道的时代,XML配置⽂件出现的频率越来越少了。注解慢慢替代了XML,现在就让我们来看看springboot是怎么样集成springmvc纯注解版的吧。
正⽂
创建好⼀个springboot项⽬后,要想使⽤springmvc很简单,只需要在pom⽂件⾥⾯添加上相应的依赖即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在springboot项⽬中使⽤springmvc,我们再也不⽤去配置l⽂件了,只需要写普通的类和⽅法,
然后加上注解,就能实现处理url 请求的功能。下⾯这个⽰例就是⼤家⼊门springmvc时写的第⼀个hello world。
package org.study.ller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
springmvc的注解有哪些@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return"Hello";
}
}
加下来看看纯注解版的springmvc是如何⽣效的。
servlet容器(如Tomcat)在启动应⽤的时候,会扫描当前应⽤中每⼀个jar包⾥⾯,路径为META-
INF/services/javax.servlet.ServletContainerInitializer的⽂件的内容,⽂件⾥⾯是⼀个全类名,顾名思义,这个类就是servlet容器的初始化器。
点进去看看,这个类只有⼀个onStartup⽅法,⽅法执⾏时,会将@HandlesTypes注解⾥⾯的类型的所有⼦类(⼦接⼝、实现类等)都传递到⽅法的第⼀个参数中,传进来后就可以对类进⾏操作,⽐如⽤反射创建对象,实际上,代码⾥就是反射创建了对象。第⼆个参数servletContext代表当前web应⽤,⼀个web应⽤对应⼀个servletContext。可以⽤servletContext注册⼀些web组件(servlet、filter、listener)。
我们再来看看@HandlesTypes这个注解⾥⾯的那个接⼝WebApplicationInitializer.class,这个接⼝下⾯有⼀个AbstractAnnotationConfigDispatcherServletInitializer类,这是⼀个抽象类,我们要做的就是集成这个类,实现其中的抽象⽅法。
接下来我们实现这个类,分别实现3个⽅法,这3个⽅法分别指定了2个配置⽂件类和servlet映射路径。
package org.study.fig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[]getRootConfigClasses(){
return new Class[]{ RootConfig.class};
}
@Override
protected Class<?>[]getServletConfigClasses(){
return new Class[]{WebConfig.class};
}
@Override
protected String[]getServletMappings(){
return new String[]{"/"};
}
}
1、RootConfig,没啥特别,⼀般⽤来扫描除了@Controller的其他组件。
package org.study.fig;
import t.annotation.Configuration;
@Configuration
public class RootConfig {
}
2、WebConfig,⼀旦这个配置类加上了@EnableWebMvc这个注解,则对于mvc的⾃动配置全都不要了,所有的配置都在WebConfig配置类⾥⾯配置,具体有哪些配置⽅法,可以看看继承的WebMvcConfigurerAdapter类⾥⾯的⽅法。
package org.study.fig;
import t.annotation.ComponentScan;
import t.annotation.Configuration;
import org.springframework.fig.annotation.EnableWebMvc;
import org.springframework.fig.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
@ComponentScan("org.study.ller")
public class WebConfig extends WebMvcConfigurerAdapter {
}
我们来看看WebMvcConfigurerAdapter类的⽅法,这个类⾥⾯可以添加跟⼊参解析和返回值处理相关的⽅法,如下图圈起来的⽅法。
总结
以上就是springboot下的springmvc纯注解开发,下⼀篇我们来看⼀下DispatcherServlet是如何⼯作的。