Spring中的AOP
- AOP
- bean.xml文件的配置(基于xml的配置)
- 增强类
- 基于注解的aop配置
AOP
Spring框架中采用动态代理来实现方法的增强,称之为AOP即面向切面编程
要增强的方法称为切入点方法
AOP中的通知(即增强的内容)分为:
前置通知:在切入点方法之前执行
后置通知:在切入点方法正常执行之后执行
异常通知:在切入点方法出现异常之后执行
最终通知:最终都会执行的方法
环绕通知:可以通过代码来实现上述的四个通知
bean.xml文件的配置(基于xml的配置)
增强类
package com.wuxudong.log;import org.aspectj.lang.ProceedingJoinPoint;public class Logger {public void beforeLog(){System.out.println("前置通知");}public void afterReturningLog(){System.out.println("后置通知");}public void afterThrowingLog(){System.out.println("异常通知");}public void afterLog(){System.out.println("最终通知");}public Object aroundLog(ProceedingJoinPoint pjp){//定义返回值Object rtValue=null;try{//前置通知System.out.println("前置通知");Object [] args=pjp.getArgs();//执行切入点方法rtValue=pjp.proceed(args);//后置通知System.out.println("后置通知");} catch (Throwable throwable) {throwable.printStackTrace();//异常通知System.out.println("异常通知");} finally {System.out.println("最终通知");}return rtValue;}
}
基于注解的aop配置
bean.xml文件
增强类
package com.wuxudong.log;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component("logger")
@Aspect
public class Logger {@Pointcut("execution(* com.wuxudong.service.impl.*.*(..))")public void pt1(){}@Before("pt1()")public void beforeLog(){System.out.println("前置通知");}@AfterReturning("pt1()")public void afterReturningLog(){System.out.println("后置通知");}@AfterThrowing("pt1()")public void afterThrowingLog(){System.out.println("异常通知");}@After("pt1()")public void afterLog(){System.out.println("最终通知");}@Around("pt1()")public Object aroundLog(ProceedingJoinPoint pjp){//定义返回值Object rtValue=null;try{//前置通知System.out.println("前置通知");Object [] args=pjp.getArgs();//执行切入点方法rtValue=pjp.proceed(args);//后置通知System.out.println("后置通知");} catch (Throwable throwable) {throwable.printStackTrace();//异常通知System.out.println("异常通知");} finally {System.out.println("最终通知");}return rtValue;}
}