Java学习笔记之Spring篇
对于Spring,我们长话短说,直击要害,下面是一些本人的笔记
IOC
IOC(Inversion of Control):控制反转。
IOC中还有一个重要的机制——依赖注入:把底层类作为参数传递给上层类,实现上层对下层的“控制”。
IOC、DL、DI的关系
IOC容器的优势
- 避免在各处使用new来创建类,并且可以做到统一维护;
- 创建实例时不需了解其中的细节。
Bean和Spring容器的关系
Spring IOC支持的功能
- 依赖注入;
- 依赖检查;
- 自动装配;
- 支持集合;
- 指定初始化方法和销毁方法;
- 支持回调方法。
Spring IOC容器的核心接口:BeanFactory、ApplicationContext。
BeanDefinition:主要用来描述Bean的定义。
BeanDefinitionRegistry:提供向IOC容器注册BeanDefinition对象的方法。
BeanFactory:Spring框架最核心的接口。
- 提供IOC的配置机制;
- 包含Bean的各种定义,便于实例化Bean;
- 建立Bean之间的依赖关系;
- Bean生命周期的控制。
BeanFactory体系结构
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的生命周期
Spring Bean的销毁过程
- 若实现了DisposableBean接口,则会调用destroy方法;
- 若配置了destroy-method属性,则会调用其配置的销毁方法。
AOP
AOP:即面向切面编程,是一种编程思想,即把关注点分离,不同的问题交给不同的部分解决。
AOP织入方式
- 编译时织入:需特殊的Java编译器——AspectJ;
- 类加载时织入:需特殊的Java编译器——AspectJ和AspectWerkz;
- 运行时织入:Spring采用的方式,通过动态代理方法,实现较为简单。
AOP主要名词
- Aspect:通用功能的代码实现;
- Target:被织入Aspect的对象;
- Join Point:可作为切入点的机会,所有方法都可以作为切入点;
- Pointcut:Aspect实际被应用在的Joint Point,支持正则表达式;
- Advice:类里方法以及方法织入到目标方法的方式;
- Weaving:AOP的实现过程。
Advice的种类:前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)、环绕通知(Around)。
AOP实现:JDKProxy和Cglib
- 由AOPProxyFactory根据AdvisedSupport对象的配置来决定;
- 默认策略如果目标类是接口,则用JDKProxy来实现,否则用后者。
- JDKProxy的核心:InvocationHandler接口和Proxy类;
- Cglib:以继承的方式动态生成目标类的代理。
JDKProxy:通过Java内部反射机制实现(反射机制在生成类的过程中比较高效)。
Cglib:借助ASM实现(ASM在生成类之后的执行过程中比较高效)
代理模式:接口+真实实现类+代理类
Spring中的代理模式
- 真实实现类的逻辑包含在getBean方法中;
- getBean方法返回的实际上是Proxy的实例;
- Proxy实例是Spring采用JDKProxy或Cglib动态生成的。