Spring学习笔记(IOC、AOP)

Spring学习笔记(IOC、AOP)

之前通过网上资源和博客,记录一下Spring的内容

IOC(Inversion of Control):控制翻转

Spring Core 最核心的部分

需要最先了解依赖注入(Dependency Inversion)

所谓的依赖注入:就是把底层类作为参数传递给上层类,实现上层对下层的“控制”

Spring学习笔记(IOC、AOP)

IOC的另一个实现方式是DL(依赖查找),这是一个相较于DI而言更为主动的方法,在需要的时候调用框架所提供的方法来获取对象,需要提供配置文件信息,但是这个需要用户自己去使用API查找资源,有侵入性。

依赖注入方式

Setter

Interface

Constructor

Annotation

Spring学习笔记(IOC、AOP)

IOC容器的优势:

避免在各处出现使用new来创建类,可以做到统一维护

创建实例时,不需要了解其中的细节

Spring学习笔记(IOC、AOP)

IOC是从上往下去查找依赖关系,到达最底层的时候,再反过来一步一步往上去new实例对象。

在我们重新编写一个底层有几百个依赖关系的API的时候,我们不需要去了解他底层是怎么样的,因为IOC Container的特性要求编写每个Class的时候都需要相应的config文件,只要在需要使用的地方注入这个service就可以了,这样就提高了项目的可维护性,降低了开发难度。

Spring学习笔记(IOC、AOP)

Spring IOC支持的功能

依赖注入

依赖检查

自动装配

支持集合

指定初始化方法和销毁方法

支持回调方法

Spring IOC容器的核心接口

BeanFactory

ApplicationContext

**BeanDefinition:**主要用来描述Bean的定义,在spring启动的时候会将xml或者注解里的Bean解析成BeanDefinition

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

**BeanFactory:**Spring框架最核心的接口,提供了IOC的配置机制,包含Bean的各种定义,便于实例化Bean,建立Bean之间的依赖关系,Bean生命周期的控制

Spring学习笔记(IOC、AOP)

ApplicationContext的功能(集成多个接口)

BeanFactory:能够管理、装配Bean

ResourcePatternResolver:能够加载资源文件

MessageSource:能够实现国际化等功能

ApplicationEventPublisher:能够注册监听器,实现监听机制

Springboot中**@Compent就是代表这个类要扫描装配进IOC中,那么在启动类中@CompentScan就会去扫描装配的Bean,不过在启动类中的@SpringBootApplication**已经存在了这个功能,所以不需要再单独写一次。

@Autowired会找到对应的Bean

getBean方法的代码逻辑

转换beanName -> 从缓存中加载实例 -> 实例化Bean -> 检测parentBeanFactory -> 初始化依赖的Bean -> 创建Bean

Spring Bean的5个作用域

**singleton:**Spring的默认作用域,容器里拥有唯一的Bean实例。适合无状态的Bean

**prototype:**针对每个getBean请求,容器都会创建一个Bean实例。适合有状态的Bean,这个需要三思,频繁创建是要有开销的。

对于web容器则支持另外三种

**request:**会为每个Http请求创建一个Bean实例

**session:**为每个session创建一个Bean实例

**globalSession:**会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效

Spring学习笔记(IOC、AOP)

销毁过程:

如果实现了DisposableBean接口,则会调用destroy方法

如果配置了destry-method属性,则会调用其配置的销毁方法

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)

后置通知(AfterReturing)

异常通知(AfterThrowing)

最终通知(After)

环绕通知(Around)

**AOP的实现:**jdkProxy和Cglib

由AopProxyFactory根据AdvisedSupport对象的配置来决定

默认策略如果目标类是接口,则用jdkProxy来实现,否则用后者

JDKProxy的核心:InvocationHandler接口和Proxy类,通过Java的内部反射机制实现(反射机制在生成类的过程中比较高效)

Cglib:以继承的方式动态生成目标类的代理,借助ASM实现(ASM在生成类之后的执行过程中毕竟高效)

Spring里的代理模式的实现

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

真实实现类的逻辑包含在getBean方法里

getBean方法返回的实际上是Proxy的实例

Proxy实例是Spring采用JDK Proxy或cglib动态生成的