Java 框架-Spring

11-1 Spring家族的介绍 11-2 IOC原理 11-3 SpringIOC的应用 11-4 SpringIOC的getBean方法的解析 11-5 AOP的介绍和使用 11-6 SpringAOP的原理

11-1 Spring家族的介绍

Spring 家族

11-2 IOC原理

  • IOC(Inversion of Control):控制反转

    • Spring Core 最核心的部分
    • 需要先了解依赖注入(Dependency Inversion)-DI
  • DI 举例:设计行李箱

    • 上层依赖下层
      DI 举例-设计行李箱
      行李箱-上层建筑依赖下层建筑
    • 依赖注入
      设计行李箱-依赖注入
      行李箱-依赖注入
  • IOC、DI、DL 的关系
    IOC、DI、DL 的关系

  • 依赖注入的方式

    • Setter(public set() 方法)
    • Interface(接口)
    • Constructor(构造函数)
    • Annotation(注解)
  • 依赖倒置原则、IOC、DI、IOC 容器的关系
    依赖倒置原则、IOC、DI、IOC 容器的关系

  • IOC容器的优势

    • 避免在各处使用 new 来创建类,并且可以做到统一维护
    • 创建实例的时候不需要了解其中的细节

11-3 SpringIOC的应用

  • Spring IOC 容器
    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
    • 隔离级别
    • 事物传播
Comment