概念
1.连接点
可以被增强的方法。
2.切入点
实际被增强的方法。
3.通知(增强)
实际增强的部分, 比如加的日志。
4.切面 (是动作)
把通知应用到切入点过程。
通知类型
· 前置通知@Before
· 后置通知@After 方法执行之后(有没有异常都执行)
· 环绕通知@Around 方法之前之后都有, 方法里有参数(ProceedJoinpoint 表示要增强的方法)
· 异常通知@AfterThrowing 异常才执行
最终通知@AfterReturning 返回值之后执行(有异常不执行了)。
步骤
要求:
有一个普通类, 有一个切面类(带@Aspect注解),都要加入容器中。
开启切面功能@EnableAspectJAutoProxy;
普通类:
@Controller @ComponentScan("com.alex.aop1") @EnableAspectJAutoProxy // 开启切面功能 public class MathCalculator { public int div(int i, int j) { return i/j; } } |
切面类:
@Aspect @Controller public class LogAspects { // 切入点表达式写法 @Pointcut("execution(public * com.alex.aop1.MathCalculator.*(..))") private void pointCut() {} // @Before切入 @Before("pointCut()")//切入点表达式 public void logStart() { System.out.println("除法运行...参数运行列表时: {}"); } @After("pointCut()") public void logEnd() { System.out.println("除法...结束: "); } @AfterReturning("pointCut()") public void logReturn() { System.out.println("除法...返回: {}"); } @AfterThrowing("pointCut()") public void logException() { System.out.println("除法...异常: {}"); } } |
解释: pointCut方法, 抽取出来的切入点表达式, 可以在不同的通知处使用。
返回值/异常/方法信息
打印参数名和参数值
如果希望获取到函数的参数, 签名等, 就需要代入JoinPoint joinPoint作为方法参数。
打印返回值。
步骤:
1.returning = "result" 设定一个变量名result;
2.Object result 方法签名传入result;
3.方法体里就可以拿到返回值了。
@AfterReturning(value = "pointCut()", returning = "result") public void logReturn(Object result) { System.out.println("除法...返回: {"+ result +"}"); } |
异常
同上。
@AfterThrowing(value ="pointCut()", throwing = "e") public void logException(Exception e) { System.out.println("除法...异常: {"+ e +"}"); } |
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理