Spring三大核心之一的AOP:
AOP为Aspect Oriented Programming的缩写,意思是:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
如果要在Spring框架中用到面向切面编程的话可以通过注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:
- 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around)。
- 开发需要被拦截的类。
- 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式。这样的话,那就交由Spring AOP容器管理。在applicationContext.xml中添加上这句
另外需要引用 aspectJ的 jar 包: aspectjweaver.jar aspectjrt.jar
AOP涉及到的注解:
“@Component” :将类放入容器管理
“@Aspect” :切面类声明注解
”@Order(1)“ : 优先级配置注解,值越大,优先级越低
”@Pointcut(“execution(* com.xxx.service..(…))”) “ 切点配置。 第一个* 代表
任意返回值 第二个代表com.xxx.service包中的任意类 第三个代表任意方法 …代表任意
参数列表
”@Before(value=“aspect()”)“ :前置通知,在方法前执行。 Value值为切点函数。
”@After(value=“aspect()”)“ : 后置通知,在方法后执行。
”@AfterReturning(value=“aspect()”,returning=“objValue”)“:后置返回通知。
Returning的值为方法的返回值对象。
”@AfterThrowing(value=“aspect()”,throwing=“e”)":后置异常通知。 Throwing
的值为方法抛出的异常对象。
”@Around(value=“aspect()”)“:环绕通知,围绕着方法执行
涉及类:
JoinPoint:切点类,里面包含执行方法的信息
JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可
以获取到封装了该方法信息的JoinPoint对象。
方法名 | 功能 |
Signature getSignature(); | 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的class的信息 |
Object[] getArgs(); | 获取传入目标方法的参数对象 |
Object getTarget() | 获取被代理的对象 |
Object getThis() | 获取代理对象 |
ProceedingJoinPoint:Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础
上暴露出 proceed 这个方法。通过在proceed方法前后添加操作达到环绕的目的。
方法名 | 功能 |
Object proceed() throws Throwable | 执行目标方法 |
Object proceed(Object[] var1) throws Throwable | 传入的新的参数去执行目标方法 |
方法名 功能
Object proceed() throws Throwable 执行目标方法
Object proceed(Object[] var1) throws
Throwable 传入的新的参数去执行目标方法
最后一个就是方法的执行循序了:
1、 同一切面 前置和环绕先执行 目标方法执行 后置和环绕执行
2、 不同切面 高优先级:前置先执行,后置后执行 低优先级:前置后执行,后置先执行
有一个要注意的是:前置和环绕执行顺序不确定