11-1 Spring家族的介绍
11-2 IOC原理
-
IOC(Inversion of Control):控制反转
- Spring Core 最核心的部分
- 需要先了解依赖注入(Dependency Inversion)-DI
-
DI 举例:设计行李箱
- 上层依赖下层
- 依赖注入
- 上层依赖下层
-
IOC、DI、DL 的关系
-
依赖注入的方式
- Setter(public set() 方法)
- Interface(接口)
- Constructor(构造函数)
- Annotation(注解)
-
依赖倒置原则、IOC、DI、IOC 容器的关系
-
IOC容器的优势
- 避免在各处使用 new 来创建类,并且可以做到统一维护
- 创建实例的时候不需要了解其中的细节
11-3 SpringIOC的应用
-
Spring IOC 容器
-
Spring IOC 支持的功能
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化方法和销毁方法
- 支持回调方法
-
Spring IOC 容器的核心接口
- BeanFactory
- AppplicationContext
-
BeanDefinition
- 主要是用来描述 Bean 的定义
-
BeanDefinitionRegistry
- 提供向 IOC 容器注册 BeanDefinition 对象的方法
- 包含 Bean 的各种定义,便于实例化 Bean
- 建立 Bean 之间的依赖关系
- Bean 生命周期的控制
-
BeanFactory 与 ApplicationContext 的比较
- BeanFactory 是 Spring 框架的基础设施,面向 Spring
- ApplicationContext 面向使用 Spring 框架的开发者
-
ApplicationContext 的功能(继承多个接口)
- BeanFactory:能够管理、装配 Bean
- ResourcePatternResolver:能够加载资源文件
- MessageSource:能够实现国际化等功能
- ApplicationEventPublisher:能够注册监听器,实现监听机制
11-4 SpringIOC的getBean方法的解析
-
getBean()代码逻辑
- 转换 beanName
- 从缓存中加载实例
- 实例化 Bean
- 检测 parentBeanFactory
- 初始化依赖的 Bean
- 创建 Bean
-
SpringBean 的作用域
- singleton:Spring 的默认作用域,容器里用友唯一的 Bean 实例
- prototype:针对每个 getBean 请求,容器都会创建一个 Bean 实例
- request;会为每个 Http 请求创建一个 Bean 实例
- session:会为每个 session 创建一个 Bean 实例
- globalSession:会为每个全局 HttpSession 创建一个 Bean 实例,该作用域仅对 Portlet 有效
-
SpringBean 的生命周期
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
- 若实现了 DisposableBean 接口,则会调用 destoryfan()方法
- 若配置了 destry-method 属性,则会调用其配置的销毁方法
11-5 AOP的介绍和使用
-
关注点分离:不同的问题交给不同的部分去结解决
- 面向切面编程 AOP 正是此种技术的体现
- 通用化功能代码的实现,对应的就是所谓的切面(Aspect)
- 业务功能代码和切面代码分开后,架构将变得高内聚低耦合
- 确保功能的完整性:切面最终需要被合并到业务中(Weave)
-
AOP 的三种织入方式
- 编译时织入:需要特殊的 Java 编译器,如 AspectJ
- 类加载时织入:需要特殊的 Java 编译器,如 AspectJ 和 AspectWerkz
- 运行时织入:Spring 采用的方式,通过动态代理的方式,实现简单
-
AOP 的主要名词概念
- Aspect:通用功能的代码实现
- Target:被织入Aspect 的对象
- Join Point:可以作为切入点的机会,所有方法都可以作为切入点
- Pointcut:Aspect 实际被应用在 Join Point,支持正则
- Advice:类里的方法以及这个方法如何织入到目标方法的方式
- Weaving:AOP 的实现过程
-
Advice 的种类
- 前置通知(@Before)
- 后置通知(@AfterReturning)
- 异常通知(@AfterThrowing)
- 最终通知(@After)
- 环绕通知(@Around)
11-6 SpringAOP的原理
-
AOP 的实现;JDKProxy 和 Cglib
- 由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定
- 默认策略如果目标类是接口,则用 JDKProxy 来实现,否则用后者
- JDKProxy 的核心;InvocationHandler 接口和 Proxy 类
- Cglib:以继承的方式动态生成目标类的代理
- JDKProxy:通过 Java 的内部反射机制实现
- Cglib:借助 ASM 实现
- 反射机制在生成类的过程中比较高效
- ASM 在生成类之后的执行过程中比较高效
-
代理模式:接口 + 真实实现类 + 代理类
-
Spring 里的代理模式的实现
- 真实实现类的逻辑包含在了 getBean 方法里
- getBean 方法返回的实际上是 Procy 的实例
- Proxy 实例是 Spring 采用 JDKProxy 或者 Cglib 动态生成的
-
Spring 事物的相关考点
- ACID
- 隔离级别
- 事物传播