原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9560803.html
一、概述
Spring的两大特性:IOC和AOP。
AOP是面向切面编程,Spring内置了自己实现的基于动态代理技术的AOP,同时还支持成熟的AspectJ框架,我们这里主要讲述的还是内置的基于动态代理的AOP实现。因为面对一些普通的需求,Spring内置的AOP已经绰绰有余。
AOP一般用于增强原来的代码的功能,这种增强体现在辅助方面,比如安全、日志、事务等。
二、术语
1、连接点(JoinPoint)
连接点就是具体的代码中的切入点,指的是具体的一处代码位置。
2、切点(PointCut)
切点是对一系列代表同种功能(目的)的切入点(连接点)的统称,切点不是一个点,而是代表某一功能的一系列连接点的集合。
3、通知(Advice)
通知就是我们要在切点执行的操作,就是我们要实现的目的,是要实现的功能的代码实现。一般通知又称为增强,所谓增强就是对原来功能的基础上添加新功能,进行功能增强。
4、切面(Aspect)
切面是通知和切点的综合体,定义好了一个切面,那么我们就知道,这个AOP要实现的功能是什么,需要切入到程序中的那些地方。抽象层次中,切面是代码功能的横切面,这个横切面的位置就是切点、这个切面的功能就是通知。
5、织入(Weaving)
织入就是切面作用到目标代码中的方式,Spring内置的AOP采用的是动态代理的方式来织入,还可以采用编译器织入和加载期织入,后两者分别需要特定的编译器和类加载器来完成,后两种方式是AspectJ所支持的织入方式。
6、引介(Introduction)
引介是另一种类型的增强,它可以为类添加一些属性和方法。它和通知是并列的两种不同的增强。
7、目标对象(Target)
目标对象就是我们想要织入的对象,一般不会是一个,通常是一批符合条件的对象。
8、代理(Proxy)
代理就好理解了,Spring内置的AOP就是通过动态代理的方式实现织入的,创建目标对象的代理类,在代理类中执行通知的内容,然后在合适的位置调用目标对象的方法,来达到织入的目的。
三、Spring AOP概述
Spring AOP是基于动态代理技术实现的切面编程,代理技术包括JDK动态代理和CGLIB动态代理,前者基于接口实现,后者基于类实现。
1、Spring中使用AOP技术的方式:
1)定义切面类,使用@Aspect注解
2)在切面类中定义切点方法,使用@PointCut注解
3)在切面类中定义通知方法,使用@Before、@After、@Around等注解
4)在通知方法的注解中使用切点方法
5)在切面类上加设注解@Component
6)启动AOP功能,两种方式:原始的XML配置方式和注解方式
XMl方式:<aop:aspectj-autoproxy/>
注解方式:@EnableAspectJAutoProxy
配置方式:spring.auto.proxy=true
2、Spring AOP支持的增强类型
通知增强:Advice
前置通知:MethodBeforeAdvice-在连接点之前执行
后置通知:AfterReturningAdvice-在连接点正常执行完后执行,如果还未到连接点就异常,不会执行
环绕通知:AroundAdvice-在连接点前后执行
异常通知:AfterThrowingAdvice-在连接点抛出异常后执行
finally通知:AfterAdvice-最终执行,无论是否异常,方法执行结束都会执行
引介增强:IntroductionInterceptor->DelegatingIntroductionInterceptor
前五种很好理解,重点是最后一种引介增强,这种增强并不是针对方法的增强,而是针对类的增强,它会为目标添加属性和方法,比如它可以为目标类添加一个接口的实现。目标类原本没有实现某个接口,但是我们可以使用引介增强的方式为目标类创建一个实现该接口的代理,在这个代理中可以使用接口的功能来作用于目标对象。
3、原理图:(右键打开看大图)
四、源码分析
1、入口
1.1 入口一:<aop:aspectj-autoproxy/>
源码1-来自:AopNamespaceHandler