springmvc源码深度解析
工程代码
建议先精读springmvc零配置原理
pom文件 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.5</version>
</dependency>
项目启动类-启动tomcat,回调onStartup初始化spring及mvc环境
public class MySpringApplication {
public static void main(String[] args) throws Exception {
MySpringApplication.run();
}
public static void run() throws Exception {
Tomcat tomcat = new Tomcat();
tomcat.setPort(80);
//addContext ,不是web项目,不会回调SpringServletContainerInitializer的onStartup方法
Context context = tomcat.addContext("/", System.getProperty("java.io.tmpdir"));
//添加LifecycleListener回调SpringServletContainerInitializer的onStartup方法
context.addLifecycleListener((LifecycleListener)
Class.forName(tomcat.getHost().getConfigClass()).newInstance());
tomcat.start();
tomcat.getServer().await();
}
}
初始化spring及mvc环境
public class LryWebApplicationInitializer implements WebApplicationInitializer {
//启动tomcat的时候会调用这里
@Override
public void onStartup(ServletContext servletCxt) {
//spring环境
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
//DispatcherServlet,mvc环境
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
AppConfig配置文件
@Configuration 加了这个注解是spring全配置类,会被cglib代理,为什么会被代理我猜测是他要对这个类做逻辑增强防止某些非法事件发生,见下例
@ComponentScan("com.lry")
public class AppConfig {
}
解释@Configuration 为什么要被cglib代理
public class A {
public A(){
System.out.println("A");
}
}
public class B {
public B(){
System.out.println("B");
}
}
@Configuration
@ComponentScan("com.lry")
public class AppConfig {
@Bean
public A getA(){
return new A();
}
@Bean
public B getB(){
getA();
return new B();
}
}
在加上@Configuration的情况下A,B分别打印一次(一次A被cglib过滤了)
当你不加@Configuration,A会被打印两次
controller文件–实现controller的三种方式
方式一,@Controller注解
@Controller
public class HelloController {
@GetMapping("hello")
@ResponseBody
public String hello(){
return "hello SpringMVC";
}
}
方式二,实现Controller接口
访问/implementsController这个路径时会调用handleRequest方法,一个类只能处理一个请求,和原始servlet一样
@Component("/implementsController")
public class C1 implements Controller {
@Override
p

本文深入剖析SpringMVC的工作原理,从零配置原理出发,详细介绍DispatcherServlet如何处理请求,包括HandlerMapping、HandlerAdapter的选择机制,以及适配器模式的应用。同时,探讨了自定义ArgumentResolver的实现。
最低0.47元/天 解锁文章
3514

被折叠的 条评论
为什么被折叠?



