SpringMVC复习笔记

  • Spring的理解: Spring 是一个用于构建企业级 Java 应用程序的综合性框架。它提供了广泛的功能,包括依赖注入、面向切面编程、数据访问、事务管理等;其核心观念是IOC(控制反转)以及AOP(切面编程);
    • IoC: Spring改变了传统Bean的管理,不在由对象自身管理对象之间的依赖关系,将Bean交给的一个外部容器进行管理;使用依赖注入的方式,完成对象之间的依赖,实现程序解耦,达到一种控制反转的效果;也可以称之为Spring容器;
    • AOP: 基于动态代理,对类的方法再执行前,执行完成,完成后进行自定义处理,达到一个逻辑切面的效果;AOP主要用于事务管理,日志处理;
      • 切入点(PointCut): 再哪个类,类的哪个方法,切入(where)
      • 通知(Advice):再切入点的那个时机(执行前,执行完,最后)切入(when),切入后做什么(what)
      • 切面(Acpect):切入点+通知;描述再某个切入点再某个时机执行的逻辑;
      • 织入(Warving): 注入切面类,完成切面,这一步由spring完成;
    • 动态代理:
      • 一个是Jdk提供的代理方式,使用InvocationHandler.invoke()调用被代理类的方法,配合Proxy.newProxyInstance()来对接口实现;Jdk的方式只能对接口进行代理;
      • 还有一个是使用继承的方式,通过CGLib代码生成库根据被代理类字节码文件进行拼接处理生成子类代理;适用于没有接口实现时,代理对象;
    • SpringBean的生命周期:
    • 实例化:首先,Spring容器再启动时,会按需要依次实例化Bean,
    • 依赖注入,Aware回调:完成之后,会开始设置属性,也就是依赖注入;然后检查属性是否存在实现xxxAutoWare接口(xxxAware接口时Spring里面的特殊回调接口,主要用于获得Spring的容器内部的信息,比如BeanNameAware接口就会回调setBeanName(),Bean就可以通过这个接口获得自己再SpringIoc里面的BeanName);
    • 自定义的初始化:这个时候,Bean创建基本完成,Spring会检查Bean是否有BeanPostProcessor的实现,如果有调用会调用BeanProcessBeforeInitialization(),这里会传入Bean对象,可以在这里对Bean进行处理;之后,Spring会检查是否有InitializingBean接口的实现,如果有则会调用afterPropertiesSet()方法,这里不会传入Bean对象; 处理完成,Spring会检查是否有自定义的init-method;之后调用BeanProcessAfterInitialization()进行后置处理;
    • 销毁:注册一些Distruction的必要接口,检查自定义的destory-method
    • Bean的生命周期是导致出现循环依赖的关键,Spring为此引入了三级缓存来解决;
  • Spring的三级缓存:其实也就是三个CurrentHashMap
    • 一级缓存(singletonObject):这里的Bean是以及完成了生命周期的Bean;依赖注入也是这里获得的Bean;
    • 二级缓存(earlySingletonObjects):这里的Bean都是半成品的Bean,也就是声明周期还没有完成;
    • 三级缓存(singletonFactories):这里是每个Bean在创建时的ObjectFactory,通过这个工厂可以得到早起引用(也就是半成品的Bean,这里的bean和一开始bean是同一个对象),这个早期引用可以是代理对象,也可以是未完成生命周期的bean;三级缓存里的对象工厂,可能不一定会被调用,只有出现循环依赖的时候,才会使用,一般情况下,对象创建只要一二级缓存就可以实现【他是解决循环依赖的关键】
    • 解决流程:假设存在A依赖B,B依赖A;
      • 根据Bean的生命周期,首先创建A的实例,开始进行依赖注入,发现依赖B,Spring会去一二三级里面找,如果三级里没有,说明B还没有被实例化,于是将A的ObjectFactory放入三级缓存中;
      • 开始创建B,发现依赖于A,于是开始再一二三级缓存中找,最后再三级缓存中找到A的对象工厂,通过工厂得到A的早起引用;经过一系列的初始化,B的生命周期完成,放入一级缓存中。
      • 回到A的注入,这是Spring重新查找,再一级缓存中取出B,完成注入;经过一系列初始化初始化,完成A的生命周期,并添加到一级缓存中。完美解决循环依赖问题。
  • Spring事务:两个基本概念,声明式事务和编程式事务;声明式事务就是使用@Transcational注解,通过动态代理实现事务管理;编程式事务也就是使用硬编码的方式,手动进行begainTrans()rollback()commit()操作,
  • SpringMVC执行流程:
    • 首先,客户端发送http请求,Tomcat对输入流进行编码解码,交给DispatchServlet
    • DispatchServlet将请求数据分发给HandlerMapper(处理器映射器)处理,
    • HandlerMapper根据url匹配与之对应的Handler(也就是Controller),并返回HandlerMapper执行链;
    • DispatchServlet根据执行链执行对应的Controller,Controller获得返回ViewAndModel对象,
    • 将结果交给ViewResolver(视图解析器)根据ViewAndModleviewName,进行解析处理解析,并将View返回,
    • 最后DispatchServlet将Model数据进行渲染处理,最后交给Tomcat返回给客户端;
  • 几个容易忽略的类:
    • MessageConverter:消息转换器,主要用于对Controller的返回结果进行处理,Controller会自动根据返回值类型进行相应的处理;比如HttpJackson2MessageConverter对Java对象进行序列化成json字符串,StringMessageConverter对结果进行字符串转换处理;
posted @   乐可乐  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示