AOP切面使用

2021/6/9 18:51:33

本文主要是介绍AOP切面使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、主要设计注解: @Aspect @After @before @Pointcut @Around

pom文件引入

<!--用于aop切面编程-->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

</dependency>

二、AOP核心概念

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体特征的抽象,切面就是对横切关注点的抽象

3、连接点(joinpoint)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)

对连接点进行拦截的定义

5、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

6、目标对象

代理的目标对象

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

execution后面参数的定义

eg.

  • 任意公共方法的执行:execution(public * *(..))
  • 任何一个以“set”开始的方法的执行:execution(* set*(..))
  • AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
  • 定义在service包里的任意方法的执行: execution(* com.xyz.service.*.*(..))
  • 定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service..*.*(..))

第一个*表示匹配任意的方法返回值execution(* , ..(两个点)表示零个或多个参数,第一个..表示service包及其子包,第二个*表示所有类, 第三个*表示所有方法,第二个..表示方法的任意参数个数

 

注解实现:

1、引入注解

2、顶一个切面类LogAspect ,要对下面Controller下面所有类进行切面

 

具体代码:

@Aspect
@Order(1)//指定切面的优先级
@Component
@EnableAspectJAutoProxy //使aspect起作用 自动匹配代理对象
public class LogAspect {
   @Pointcut("execution(* com.example.springbootproject.Controller.*.*(..))")//定义在Controller包里所有类,所有的方法的任意方法的执行
    public void apilog() {
    }

    @Before("apilog()")
    public void doBefore() {
        System.out.printf("Before方法执行");
    }

    @After("apilog()")
    public void doAfter() {
        System.out.printf("after方法执行");
    }


    @Around("apilog()") //这里必须有返回对象,否则切面接口 void就会出现无返回
    public Object logArround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        System.out.println("环绕前入参:"+JSON.toJSONString(args[0]));
        System.out.println(joinPoint.getSignature());
        Object proceed = joinPoint.proceed();
        System.out.println("出参:"+JSON.toJSONString(proceed));
        System.out.println("环绕后");
        return proceed;
    }

}

执行结果:

 



这篇关于AOP切面使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程