notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • Spring IOC容器
  • Bean的生命周期
  • SpringMVC中请求的生命周期
  • SpringMVC生命周期总控——DispatcherServlet
  • Spring循环依赖问题
  1. programming-language
  2. Java

Spring知识

PreviousJavaNextJava

Last updated 3 years ago

Spring IOC容器

spring-ioc容器初始化

Bean的生命周期

  1. 根据BeanDefinition信息,实例化对象,Constructor构造方法;

  2. 根据BeanDefinition信息,配置Bean的所有属性(将bean的引用注入到bean对应的属性,*可能存在循环依赖问题);

  3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName,参数为Bean的Id;

  4. 如果Bean实现BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;

  5. 如果Bean实现ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;

  6. 如果存在类实现了BeanPostProcessor接口,执行这些实现类的postProcessBeforeInitialization方法,这相当于在Bean初始化之前插入逻辑 ;

  7. 如果Bean实现InitializingBean接口, 执行afterPropertiesSet方法;

  8. 如果Bean指定了init-method方法,就会调用该方法。例:<bean init-method="init"> ;

  9. 如果存在类实现了BeanPostProcessor接口,执行这些实现类的postProcessAfterInitialization方法,这相当于在Bean初始化之后插入逻辑 ;

  10. 这个阶段Bean已经可以使用了,scope为singleton的Bean会被缓存在IOC容器中

  11. 如果Bean实现了DisposableBean接口, 在容器销毁的时候执行destroy方法。

  12. 如果配置了destory-method方法,就调用该方法。例:<bean destroy-method="customerDestroy">

SpringMVC中请求的生命周期

SpringMVC主流程主要有三个阶段:

  1. 处理器映射阶段(HandlerMapping):通过解析url中的路径来找到对应的处理器

  2. 处理器适配阶段(HandlerAdapter):通过解析请求中的参数来适配处理器,并执行处理器

  3. 视图解析阶段(ViewResolver):如果处理器返回的是逻辑视图,那么会在这个阶段绘制成可展示的视图

而前端控制器DispatcherServlet统筹整个流程,它的工作除了流程扭转之外,还有执行各种拦截器以及统一异常管理等。

SpringMVC生命周期总控——DispatcherServlet

上图中不带有颜色的处理块的工作都是DispatcherServlet负责的。主要是拦截器的前置操作、后置操作、完成/异常操作以及最终完成操作。并且还负责统一管理主流程中出现的异常。

而蓝色块的工作属于处理器映射器,红色块的工作属于处理器适配器,绿色块的工作属于视图解析器。

Spring循环依赖问题

循环依赖:一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。如对象A依赖对象B,对象B依赖对象A。

循环依赖场景

  • 单例的setter注入(能解决)

  • 多例的setter注入(不能解决)

  • 构造器注入(不能解决)

  • 单例的代理对象setter注入(有可能解决)

  • DependsOn循环依赖(不能解决)

Spring三级缓存

  • singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例

  • earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例

  • singletonFactories 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象。

解决循环依赖 - 单例的setter注入 Spring是通过递归的方式获取目标bean及其所依赖的bean的;Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。 Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。 通俗来讲,对象A依赖对象B,对象B依赖对象A,设置属性会先把A中的B引用指向半成品的B,B中的A引用指向半成品的A,当A和B完成初始化后,这些引用也就自然指向了成品。

循环依赖就说明程序设计有问题,一般推荐使用构造注入,这样当有循环依赖时会直接报错无法启动,而setter注入会成功。

Bean的生命周期
image
image