00-1010全称面向方面编程,即面向方面编程。
一个非常生动的描述,aop的应用程序就像一个汉堡。aop的代码是汉堡最外面的两片面包,应用程序是汉堡中心的馅料。
然而,我们的aop程序可以选择包是在顶部,还是在底部,或者两者都有。
00-1010定义一个标准类,然后为这个类标记以下两个注释:
@Aspect,这意味着这是一个标准的spring aspect类。
@Component,这意味着这需要交给spring进行生命周期管理。
AOP 是什么
如果需要执行的顺序,那么第三个注释@Order应该添加到相应的切片类中。代码示例:
@Aspect
@组件
@订单(1)
公共类HttpResultAspect {
其中,顺序值越小,剖切面的执行顺序越早。由于剖切面的特性,下面会有多个剖切面的执行示意图。
如何定义一个 AOP
多个 AOP 的执行顺序
执行(* *。*(.))
AOP 拦截表达式
执行(* com . rlzz . r9 . mapper . * mapper . findall(.))第一个' * ',任何类型的返回值。
第二个' * ',任何包路径(包路径中的两点,表示当前包及其子包)
第三个' * ',任何方法名
括号中的两点,任何参数
00-1010例如,我们需要编写一个表达式来截取com.wb.UserService.findAll()。以下是一些可行的表达方式。
执行(* com).*(.))
执行(* com.wb.*(.))
执行(* com.wb. *服务。*(.))
执行(* com.wb.*Service.find*(.))
执行(* com.wb.*Service.findAll(.))
执行(* com.wb).查找*(.))
常规写法
@环绕('执行(* com . rlzz . r9 . mapper . * mapper . update(.))'||执行(* com . rlzz . r9 . mapper . * mapper . save(.))')
public D将RcsDto D扩展到after saveorupdate(proceedingjoint joint){ 0
}
示例讲解
您可以使用逻辑判断或-||、和-将多个表达式串在一起,以确定是否有必要拦截目标方法。00-1010表达式通常直接写在方法上。当我们需要重用表达式时,我们可以使用@PointCut来提取它们。
上面的示例代码可以修改为
@PointCut('执行(* com . rlzz . r9 . mapper . * mapper . update(.))')
private void mapperUpdate(){}
@PointCut('执行(* com . rlzz . r9 . mapper . * mapper . save(.))')
private void mapperSave(){}
@ about(' mapperUpdate()| | mapperSave()')
public D将RcsDto D扩展到after saveorupdate(proceedingjoint joint){ 0
}
00-1010是比较正式的说法。aop中有五种通知。
00-1010提前通知,执行前法拦截。
@Before('执行(* com . rlzz . r9 . mapper . * mapper . delete(.))')
public void delete(org . AspectJ . lang . JoinPoint JoinPoint){ }
00-1010围绕着通知,在拦截方法之前执行,那么我们需要手动执行目标方法,然后在执行目标方法之后手动返回返回值。
@ about('执行(* com . rlzz . r9 . mapper . * mapper . save(.))')
公共对象around findall(org . AspectJ . lang . proceedingjointpoint join point){ 0
object obj=JoinPoint . progress();//表示执行拦截方法中的方法体。
返回对象;//执行完方法后需要手动返回结果(可以控制返回结果)
}
00-1010后通知,截取方法后执行。
@After('执行(* com . rlzz . r9 . mapper . * mapper . update(.))')
public void update(org . AspectJ . lang . JoinPoint JoinPoint){ }
复制代码
示例2
,是@after的增强注解,可以在方法执行后得到返回值,我们可以对返回值做一些测试和判断。如果返回值是引用类型,我们甚至可以修改这个引用对应的值。
@PointCut('执行(* com . rlzz . r9 . mapper . * mapper . findall(.))')
private void mapperFindAll(){}
@ after returning(returning=' list ',切入点='mapperFindAll()')
public void FindAll(org . AspectJ . lang . JoinPoint JoinPoint,Object list){ 0
//对象参数的名称应该与注释中的返回值一致。
}
应用于方法上的完整示例代码
@after,另一个增强的注释,如果目标方法执行后抛出异常,会被aop拦截。然而,这种处理不同于捕获。尽管aop截获并处理了异常,但它仍然会传播给下一个更高级别的调用者。
使用多个表达式
@PointCut
AOP 执行时机
课堂学习{public void static f1(){}//(1)
public void f2(){} //(2)
公开作废f3(){//(3)
F2();
}
}
(1)不要截取静态方法。
(2)外部呼叫,可以拦截
(3)外部调用时,f3()可以被拦截,但f3()中调用的f2()不会同时被拦截。