SpringMVC
2020-06-09 本文已影响0人
一直想上树的猪
一、Spring IOC容器原理
ioc容器是什么
Map iocMap = new HashMap();
OrderService orderService = new OrderService();
iocMap.put("orderService", orderService);
ioc容器是一个很大的map对象,是单例的,只有一个map,map中放了很多java的bean对象
ioc容器如何使用?
@Autowired
private OrderService orderService;
// 直接从iocMap.get("orderService")
二、Tomcat
Tomcat启动时加载Springmvc的流程
image.png- 开发好的jar包放到tomcat指定的目录下,当启动tomcat的时候会去加载war包,加载里面的class文件。
- 在加载的时候会去找一个包下面的所有的文件(
basePackage="com.tinner.*"
)扫描com.tinner包下有哪些类声明了特殊的注解(@Cotroller、@Service、@Autowared
)找到这些特殊的类 - 然后将这些类进行实例化,Spring创建对象是通过反射的方式进行实例化的。
- 将这些实例化的bean进行存储,存储到一个map中去
- 当使用
@Autowared
的时候,通过map的get方法去获取对应的bean - 当浏览器输入一个url,如何通过对应的url找到对应的处理方法?(handlermapping),当tomcat在加载控制类的时候,类上面是有路径的,包括方法上面的也是有路径的,当实例化bean的时候, 会将类上的路径和方法上的路径拿出来进行拼接,然后绑定成一个键值对,这样就可以对一个方法进行对应的url的映射,这些很多的方法很多的路径集合成为一个handlermapping
Tomcat启动成功之后
- 进入doGet()/doPost()方法,然后根据url的映射关系去找到对应的处理该请求的方法
- 执行method
核心:DispatcherServlet
三、手写Springmvc
springmvc.png1、自定义注解
- 自定义Controller注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Controller {
String value() default "";
}
- 自定义RequestMapping注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestMapping {
String value() default "";
}
- 自定义Autowired注解
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
- 自定义RequestParam注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
String value() default "";
}
2、自定义DispatcherServlet,继承HttpServlet
里面有连个成员变量(map)
- 一个map是用来存放那些被声明了自定义Controller和自定义service的注解的类的实例bean
- 另一个map是用来存放请求路径和对应处理方法的绑定关系的相关信息
在init方法中: - 扫描路径
- 实例化对应的bean,存储到map中
- autowared处理
- url路径和方法绑定到handlermapping中
3、处理请求
处理请求时,根据路由,从handlermapping中找到对应的方法,进行处理,然后返回对应的结果