信步漫谈之自定义AOP注释
1 目标
- 自定义注释的AOP实现
2 AOP基本概念
- Aspect 【切面】:通常是一个类,里面可以定义切入点和通知;
- JointPoint 【连接点】:程序执行过程中明确的点,一般是方法的调用;
- Advice 【通知】:AOP在特定的切入点上执行的增强的处理,有before/after/around/afterRetuing/afterThrowing;
- PointCut (切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式。
- Excution 表达式:定义切入点规则,多个方法形成一个切面;
- AOP主要作用:使业务和功能代码解耦,进行无侵入性的代码增强
3 AOP之Execution表达式解释
例:execution(* .(..))
- 第一个*:代表的是方法返回的类型
- 第二个*:代表扫描的包路径;
- 第三个*:包路径下的方法名,(..)代表方法的参数;
@Around("@annotation(com.king..LogAspect)") //容器中加了LogAspect注解的类才拦截;
@Before("execution(public int com.king.aop.Calc.div(int,int))") //拦截div(intent)方法,返回参数是int;
@Before("execution(public int com.king.aop.Calc.*(..))") //拦截包下的所有的方法;
@Around("execution(public int com.king.aop.Calc.*(..)) && @annotation(log)") //将注解 DoSomething作为一个参数传递进来
4 AOP注释执行顺序
try
{
1、 环绕前置通知;@Around
2、 前置通知; @Before
3、 执行目标方法; method.invoke()
4、 环绕后置通知;@Around
5、 执行返回通知;@After
}catche(Exception e){
5.1、执行异常通知;@AfterThrowing 没有异常不打印,有异常替换@After
}finally{
6、执行后置通知;@AfterReturning
}
5 知识池
- 如果要确定两个切面的执行顺序,可以给aspect添加@Order注解,值越小优先级越高。
- JoinPoint 和 ProceedingJoinPoint的关系
- ProceedingJoinPoint 只能在@Around中使用
- JoinPoint也可以获取入参(getArgs()),它可以用于@Before 和 @AfterReturning
- Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法
- @Around如果不执行proceed(),那么原方法将不会执行
6 源码
见 https://gitee.com/alfredinchange/java-developer.git 下 com.alfred.java.customannotationaop