1.spring 容器的启动加载流程

  1. 首先解析 spring.xml 配置文件,把其中 <bean> 解析为 BeanDefinition, 存入beanFactory
<bean id="" class="" init-method="" destroy-method="" scope="" lazy-init="">

把 BeanDefinition 中的定义读取到一个map集合中管理起来了,但还没有创建 bean 的单例对象

  1. 执行beanFactory的后处理器

  2. 接下来 由 beanFactory 创建每个类对应的单例对象, 利用了反射根据类名创建每个类的实例对象(构造,初始化方法)

  3. 执行 bean 的后处理器, 它其中有两个方法,会在 bean 的初始化方法前后被调用
    会把这些结果 存入 beanFactory 的 singletonObjects 这样一个map集合里

userService -> userService对象

  1. 执行依赖注入
    主要为了解决循环引用问题

class A {
@Autowired
private B b;
}

class B {
@Autowired
private A a;
}

key value
a new A();
b new B();

map.get(“a”).setB( map.get(“b”) );
map.get(“b”).setA( map.get(“a”) )

  1. 容器.getBean(“bean id”) 根据bean 的id,把bean id当做key,进入 singletonObjects 获取值
    返回的结果就是 userSerivce对象

2.springmvc 的执行流程

  1. 所有请求通过匹配 / 路径 进入了 DispathcerServlet
  • multipartResolver 是处理文件上传的表单的解析器
  • localeResolver 提供了国际化功能
    • zh_CN -> 中文提示信息
    • en_US -> 美国英语
  • handlerMapping 用来处理浏览器的请求路径,对应控制器中哪个方法
  • handlerAdapter 用来真正执行,控制器中的方法
  • handlerExceptionResolver (异常解析器) 负责处理控制器方法中异常, @ExceptionHandler
  • viewNameTranslator 用来解析视图名称, 例如:会把方法的返回结果字符串当成视图名
  • viewResolver 视图解析器,将视图名解析为视图对象(例如jsp视图对象)

2) 进入 DispathcerServlet 后,会进入 doDispatch 方法,用来执行请求分发

  • 进入 handlerMapping 进行路径匹配,路径匹配结束返回 HandlerExecutionChain 执行链
  • 执行链里会依次调用 ***的 preHandle
  • 进入 handlerAdapter, 由它来调用控制器,回到执行链
  • 执行链里会反序调用 ***的 postHandle
  • handlerAdapter 有个返回结果 ModelAndView, 再次回到 doDispatch
  • ModelAndView 再被视图解析器解析,获得一个视图对象 View
  • View 对象调用 render 方法,负责产生一个响应结果
  • 执行链里会反序调用 ***的 afterCompletion
  • 生成的响应结果,返回给浏览器