主要模块
- Spring Core:核心类库,提供IOC服务。
- Spring Context:提供框架式的Bean访问方式。
- Spring AOP:AOP服务。
- Spring DAO:对JDBC的抽象。
- Spring ORM:对现有的ORM框架的支持。
- Spring Web:提供了面向Web的综合特性。
- Spring MVC:提供了向Web应用的MVC实现。
IOC
AOP
-
优点:面向切面编程,扩展功能不通过修改源代码实现。
-
静态AOP:编译期,切面以字节码的形式直接编译到目标字节码中。
-
动态AOP:运行期,类加载后,为接口实现动态代理类,将切面植入到动态代理类中。
设计模式
- 单例:一个Spring Bean容器(SpringContext)中仅有一个实例。
- 工厂:IOC,封装了创建Bean的过程,不通过new而是通过工厂来获取对象。
- 代理:AOP,代理类中持有一个被代理的实例,通过代理类调用被代理对象的方法,在方法前后加入其他方法处理逻辑。
- 适配器:SpringMVC中的HandleAdapter。转换类的接口。场景:第三方登录自由适配。
- 责任链:SpringMVC中的DispatchServlet。Handler定义处理请求的接口;ConcreteHandler选择处理请求或者传递请求给下家。场景:让一个以上的对象有机会处理某个请求。
Bean生命周期
-
创建
-
实例化Bean。
-
注入Bean ID,Bean Factory或者ApplicationContext。
-
调用前置初始化方法postProcessBeforeInitialization。
-
调用afterPropertiesSet方法。
-
调用Bean自身的初始化方法。
-
调用Bean的后置初始化方法postProceeAfterInitialization。
-
销毁
- 调用DisposableBean的destroy方法。
- 调用自身定制的destroy方法。
Bean作用域
类别 |
说明 |
singleton |
每个IOC容器中仅存在一个Bean实例 |
prototype |
每次从容器中调用Bean时,会返回新的实例 |
request |
每次Http请求会创建一个新的Bean,作用域仅适用于WebApplicationContext |
session |
同一个session共享一个Bean,作用域仅适用于WebApplicationContext |
配置Bean的方法
注入属性的方法
- Setter注入,构造器注入,注解注入,接口注入。
循环依赖
-
两个以上的Bean互相持有对方:构造器的循环依赖;属性的循环依赖。
-
解决方法:先从一级缓存singletonObjects获取对象(实例化完成的Bean),若获取不到且对象正在创建中,则从二级缓存earlySingletonObjects中获取对象,若获取不到对象(未装配属性的Bean),则从三级缓存singletonFactory.getObjects()获取(实例化的BeanFactory)。
-
关键:调用构造器,根据对象引用定位到堆中的对象,提前曝光对象。
- Spring父容器(包含mapper,service,dao等),SpringMVC子容器(包含controller等)。
- 子容器可以访问父容器中的对象,父容器不能访问子容器中的对象。
事务实现原理
- 划分处理单元IOC:用Spring中的IOC划分事务处理单元,将对事务的各种配置放到了IOC容器中。
- AOP拦截需要进行事务处理的类:生成代理对象,通过TransactionIntercepter完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。读取IOC事务配置属性,转化为事务处理所需要的内部数据结构。
- 事务的处理实现:委托给具体的事务处理器(TransactionManager)实现。
类加载机制
- 过程:1、加载:生成class对象;2、验证;3、准备:static变量分配内存和初始值;4、解析:符号引用替换为直接引用;5、初始化:父类没初始化需先初始化。(
家宴准解出
)
- 双亲委派机制:避免重复加载,安全。
Spring事务传播机制
事务传播行为类型 |
没有当前事务 |
存在事务 |
required |
新建 |
加入 |
supports |
非事务 |
支持 |
mandatory |
异常 |
使用 |
requires_new |
新建 |
挂起 |
not_supported |
非事务 |
挂起 |
never |
非事务 |
异常 |
nested |
新建 |
嵌套 |
BeanFactory和ApplicationContext的区别
- BeanFactory:控制Bean的生命周期,维护Bean的依赖关系;延迟加载。
- ApplicationContext: BeanFactory的子接口,提供更加完整的框架功能。容器启动时,一次性创建所有的Bean。
Spring Boot的启动流程
- 创建SpringApplicationRunListener
- 配置Environment
- 创建ApplicationContext
- 初始化ApplicationContext,设置Environment加载相关配置
- 通知contextPrepard,contextLoaded
- Refresh ApplicationContext
- 完成启动
- OVER
Spring框架中的事件
- Spring事件由ApplicationContext发布。
- ContextStartedEvent事件:ApplicationContext启动后触发。
- ContextStopedEvent事件:ApplicationContext停止后触发。
- ContextRefreshedEvent事件:ApplicationContext刷新后触发。
- ContextClosedEvent事件:ApplicationContext关闭后触发。
- Bean实现了ApplicationListener接口,当一个ApplicationEvent被发布后,bean会自动被通知。
Spring
原文:https://www.cnblogs.com/ash1523590342/p/13461603.html