前言:学ssm框架已经有很长时间,今天来复习一下
SSM图示流程:
Spring核心:Java反射
Mybatis:动态代理,而动态代理又是基于反射的,所以,ssm框架核心原理在反射。
(1)Spring(对象工厂): 平时开发接触最多的估计就是这个IOC容器,它可以装载bean(也就是Java中的类,当然也包括service、dao里面的),有了这个机制,就不用在每次使用这个类的时候为它初始化,很少看到关键字new。
(2)SpringMVC(视图控制器): 核心为一个DispatcherServlet,控制所有请求
这里奉上手写SpringMVC的核心DispatcherServlet源码
package servlet;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import annotation.HController;
import annotation.HRequestMapping;
/**
* 手写SpringMVC
*
* @author hxz
* @description TODO
* @data 2020年1月2日 上午9:39:57
*/
public class MyDispatcherServlet extends HttpServlet {
//加载属性文件
private Properties properties = new Properties();
//装载beanname
private List<String> classNames = new ArrayList<String>();
//ioc容器
private Map<String, Object> ioc = new HashMap<String, Object>();
//类似于以前自定义的cache缓存容器,这里也是起到一个容器的作用
//用于加载各个mapping
private Map<String, Method> handlerMapping = new HashMap<String, Method>();
//容器加载所有的controller
private Map<String, Object> controllerMap = new HashMap<String, Object>();
@Override
public void init(ServletConfig config) throws ServletException {
// 1.加载配置文件
doLoadConfig(config.getInitParameter("contextConfigLocation"));
// 2.初始化所有相关联的类,扫描用户设定的包下面所有的类
doScanner(properties.getProperty("scanPackage"));
// 3.拿到扫描到的类,通过反射机制,实例化,并且放到ioc容器中beanName默认是首字母小写
doInstance();
// 4.初始化HandlerMapping(将url和method对应上)
init