谈谈你对AOP的理解

概念:

AOP (面向切面编程)即面向规则编程,找出多个类中有一定规律的代码,开发时拆开,运行时再合并。本质:解耦,专人做专事。

目的

(1)、把核心业务和非核心业务进行分离    

(2)、把多个非核心业务处理(点)变成一个切面(之前的非核心业务代码需要写多次变成只需要写一次。)

要求

只有当核心类中有多个业务需要进行处理的时候使用AOP较为合理,如果只有一个业务需要被处理那么就没有必要使用AOP了。

应用场景:

1、用于日志打印

2、用于全局异常处理拦截

3、返回值统一处理

4、多数据源切换

AOP代理主要分为静态代理和动态代理,动态代理是为了解决静态代理的弊端诞生的。

 静态代理的弊端: 一个代理接口只能服务于一种类型的对象

静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表,

使用AspectJ的编译时增强实现AOP AspectJ是静态代理的增强,所谓的静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。 AspectJ会在编译阶段将Aspect织入Java字节码中, 运行的时候就是经过增强之后的AOP对象

spring默认使用jdk动态代理,如果没有实现接口,就使用cglib代理

JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

流程:

1、通过实现 InvocationHandler 接口创建自己的调用处理器;

2、通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;

3、通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;

4、调用处理器对象作为参数传入构造函数创建动态代理类实例。

Java动态代理的使用及原理分析

cglib代理CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并在拦截方法相应地方织入横切逻辑。

区别JDK代理只能对实现接口的类生成代理CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

源码spring中的应用:

IOC中bean的创建过程中有一个步骤可以对bean进行扩展实现,而aop本身就是一个扩展功能,所以在InstantiationAwareBeanBeanPostProcessor中来进行实现。

AOP在spring生命周期的使用位置

AOP源码解析(有空补上)

你可能感兴趣的:(spring)