- 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(视图解析器)根据ViewAndModle的viewName,进行解析处理解析,并将View返回,
- 最后
DispatchServlet将Model数据进行渲染处理,最后交给Tomcat返回给客户端;
- 几个容易忽略的类:
MessageConverter:消息转换器,主要用于对Controller的返回结果进行处理,Controller会自动根据返回值类型进行相应的处理;比如HttpJackson2MessageConverter对Java对象进行序列化成json字符串,StringMessageConverter对结果进行字符串转换处理;
posted @
2024-06-27 08:19
乐可乐
阅读(
27)
评论()
收藏
举报