Spring

主要模块
- Spring Core:核心类库,提供IOC服务。
- Spring Context:提供框架式的Bean访问方式。
- Spring AOP:AOP服务。
- Spring DAO:对JDBC的抽象。
- Spring ORM:对现有的ORM框架的支持。
- Spring Web:提供了面向Web的综合特性。
- Spring MVC:提供了向Web应用的MVC实现。
IOC
-
优点:控制反转,对象的创建交给Spring配置。
-
步骤:创建配置文件,配置要创建的对象类;创建工厂类,解析配置文件+反射。
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的方法
-
基于xml的配置方式
-
基于注解的配置方式
- 定义注解:@Component,@Controller,@Repository,@Service
- 生命周期注解:@PostConstruct,@PreDestroy
- 依赖检查注解
- 自动装配注解:@Autowired
-
基于Java类的配置:@Configuration,@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
- 通知Starting
- 配置Environment
- 通知environmentPrepared
- 创建ApplicationContext
- 初始化ApplicationContext,设置Environment加载相关配置
- 通知contextPrepard,contextLoaded
- Refresh ApplicationContext
- 通知Started
- 完成启动
- 通知running
- OVER
Spring框架中的事件
- Spring事件由ApplicationContext发布。
- ContextStartedEvent事件:ApplicationContext启动后触发。
- ContextStopedEvent事件:ApplicationContext停止后触发。
- ContextRefreshedEvent事件:ApplicationContext刷新后触发。
- ContextClosedEvent事件:ApplicationContext关闭后触发。
- Bean实现了ApplicationListener接口,当一个ApplicationEvent被发布后,bean会自动被通知。
Spring MVC
- DispatcherServlet用到了责任链。
- HandlerAdapter用到了适配器。

你知道的越多,你不知道的越多。

Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
浙公网安备 33010602011771号