springmvc源码深度解析

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值