1、通知(Advice):
通知描述了某一横切关注点处要完成的工作。
工作:拦截要做的事情
横切关注点:2类4个
BeforeAdvice: 目标方法执行前(前置通知MethoBeforeAdvice)、
AfterAdvice: 正常返回(返回通知AfterReturningAdvice)、异常(异常通知ThrowsAdvice)
但是没有 finally(后置通知)这种类型
Advice都是用户接口,纯用户实现。要关联到框架中执行,都是通过组合进对应的MethodInterceptor,由框架调用Intercepot的invoke方法,从而跟Advice扯上关系。
2、连接点(Joinpoint):
程序所有能够应用通知的业务方法,就是连接点。
3、切入点(Pointcut)
切入点定义了真正应用通知的地方。
切入点是连接点中的子集,因为不是所有业务方法都要执行通知方法的。
spring中允许我们方便的用正则表达式来指定。
4、切面(Aspect)
包含通知和切入点
5、引入(Introduction)
引入允许我们向现有的类添加新的方法和属性(spring提供了一个方法注入的功能)
6、目标(Target)
即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注自己要做的事
7、代理(proxy)
相当于是目标对象的替身,执行目标方法时,会应用通知的对象的前置、返回、异常、后置这些通知方法,从而增加额外逻辑。核心逻辑还是调用了目标对象的方法。
8、织入(Weaving)
把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
(1) 编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器。
编译成的.class文件中有代理动作。
(2) 类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码
.class没有被污染,但是由其加载得到的Class是增强过的,Metaspace中的code是有代理动作的。
(3) 运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术
原来的.class和Class都没有改变,而是生成一个专门放代理动作的代理对象,代理逻辑放在Inteceptor接口实现中。
Spring AOP提供两种实现:JDK动态代理 和 Cglib动态代理