## what is apo
- aop 全称(Aspect Oriented Programming)的缩写。意味切面编程。
- 作用:在不改变目标类代码的情况下,通过AOP技术增强目标类的功能。通过【预编译】和【运行期动态代理】实现程序功能的统一维护的一种技术。
-目的:利用AOP可以将系统中的业务逻辑与系统逻辑进行隔离,从而使得业务逻辑与系统逻辑之间得耦合度降低,大大提高程序的可重用性,同事提高了开发的效率。
## aop 相关术语
- Joinpoint(连接点):所谓连接点,指的是被拦截的点。在spring指的是方法,因为在spring中只支持方法类型的连接点。
- pointcut(切入点):所谓切入点,是指我们需要对哪些Joinpoint进行拦截的定义。
- Advice(通知/增强):所谓通知是指拦截到joinpoint之后所做得的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)。
- Introduction(引介): 引介是一种特殊的通知在不修改类的前提下。Introduction可以在运行期间为类动态的添加一些方法或field.
- Target(目标对象):代理的目标对象。
- weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。
- proxy(代理):一个类被aop织入增强后,就产生一个结果代理类。
- aspect(切面):是切入点和通知的结合。
- advisor(通知其,顾问):和Aspect很相似
## aop实现之aspectJ
aspectj是java实现的一个AOP框架,它能够对java代码进行AOP编译(一般在编译器进行),让java代码具有aspectJ的AOP功能(当让需要特殊的编译器)。
aspectj是采用的静态织入的方式,aspect主要采用的是编译时期织入,在这份期间使用aspectJ的ACJ编译器吧Aspect类编译成class字节码后,在java目标类编译时织入。即先编译aspect类再编译目标类。
## aop实现之spring aop
Spring Aop 是通过动态代理技术实现的,而动态代理技术则基于反射技术。动态代理的技术实现有两种,一种给予接口的JDK动态代理,一种给予继承的CGLib动态代理。
- JDK动态代理:目标对象必须实现接口,通过接口生成代理对象。完成增强
- CGlib动态代理:目标对象不需要实现接口,底层是通过继承目标对象产生代理子对象。
## spring基于Aspect 的整合
其实就是指的Spring+AspectJ整合,不过Spring已经将AspectJ收录到自身的框架中了,并且底层织入依然是采取的动态植入方式。
#### 依赖
#### 配置
- 编写接口和实现类(目标对象),并将对象交给spring ioc管理
- 编写切面:切面各种注解可参考:https://www.cnblogs.com/zhangxufeng/p/9160869.html
如:定义通用切入点,环绕切入等。