首页 > 编程知识 正文

springaop实现方式(spring aop的作用)

时间:2023-05-04 19:25:44 阅读:97003 作者:2147

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()不会同时被拦截。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。