Java学习笔记之Spring篇

对于Spring,我们长话短说,直击要害,下面是一些本人的笔记

IOC

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

IOC中还有一个重要的机制——依赖注入:把底层类作为参数传递给上层类,实现上层对下层的“控制”。

IOC、DL、DI的关系
Java学习笔记之Spring篇
IOC容器的优势

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

Bean和Spring容器的关系
Java学习笔记之Spring篇
Spring IOC支持的功能

  • 依赖注入;
  • 依赖检查;
  • 自动装配;
  • 支持集合;
  • 指定初始化方法和销毁方法;
  • 支持回调方法。

Spring IOC容器的核心接口:BeanFactory、ApplicationContext。

BeanDefinition:主要用来描述Bean的定义。

BeanDefinitionRegistry:提供向IOC容器注册BeanDefinition对象的方法。

BeanFactory:Spring框架最核心的接口。

  • 提供IOC的配置机制;
  • 包含Bean的各种定义,便于实例化Bean;
  • 建立Bean之间的依赖关系;
  • Bean生命周期的控制。

BeanFactory体系结构
Java学习笔记之Spring篇
BeanFactory与ApplicationContext的比较

  • BeanFactory是Spring框架的基础设施,面向Spring;
  • ApplicationContext面向使用Spring框架的开发者。

ApplicationContext的功能(继承多个接口)

  • BeanFactory:管理、装配Bean;
  • ResourcePatternResolver:能够加载资源文件;
  • MessageSource:能够实现国际化等功能;
  • ApplicationEventPublisher:能够注册监听器,实现监听机制。

refresh方法

  • 为IOC容器以及Bean的生命周期管理提供条件;
  • 刷新Spring上下文信息,定义Spring上下文加载流程。

getBean方法的代码逻辑:
转换beanName->从缓存中加载实例->实例化Bean->检测parentBeanFactory->初始化依赖的Bean->创建Bean

Spring Bean的作用域

  • singleton:Spring的默认作用域,容器里拥有唯一的Bean实例;
  • prototype:针对每个getBean请求,容器都会创建一个Bean实例;
  • request:会为每个Http请求创建一个Bean实例;
  • session:会为每个session创建一个Bean实例;
  • globalSession:会为每个全局Heep Session创建一个Bean实例,该作用域仅对Portlet有效.

Spring Bean的生命周期
Java学习笔记之Spring篇
Spring Bean的销毁过程

  • 若实现了DisposableBean接口,则会调用destroy方法;
  • 若配置了destroy-method属性,则会调用其配置的销毁方法。

AOP

AOP:即面向切面编程,是一种编程思想,即把关注点分离,不同的问题交给不同的部分解决。

AOP织入方式

  1. 编译时织入:需特殊的Java编译器——AspectJ;
  2. 类加载时织入:需特殊的Java编译器——AspectJ和AspectWerkz;
  3. 运行时织入:Spring采用的方式,通过动态代理方法,实现较为简单。

AOP主要名词

  • Aspect:通用功能的代码实现;
  • Target:被织入Aspect的对象;
  • Join Point:可作为切入点的机会,所有方法都可以作为切入点;
  • Pointcut:Aspect实际被应用在的Joint Point,支持正则表达式;
  • Advice:类里方法以及方法织入到目标方法的方式;
  • Weaving:AOP的实现过程。

Advice的种类:前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)、环绕通知(Around)。

AOP实现:JDKProxy和Cglib

  1. 由AOPProxyFactory根据AdvisedSupport对象的配置来决定;
  2. 默认策略如果目标类是接口,则用JDKProxy来实现,否则用后者。
  3. JDKProxy的核心:InvocationHandler接口和Proxy类;
  4. Cglib:以继承的方式动态生成目标类的代理。

JDKProxy:通过Java内部反射机制实现(反射机制在生成类的过程中比较高效)。

Cglib:借助ASM实现(ASM在生成类之后的执行过程中比较高效)

代理模式:接口+真实实现类+代理类

Spring中的代理模式

  • 真实实现类的逻辑包含在getBean方法中;
  • getBean方法返回的实际上是Proxy的实例;
  • Proxy实例是Spring采用JDKProxy或Cglib动态生成的。