ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AOP切面使用

2021-06-09 18:33:08  阅读:167  来源: 互联网

标签:.. AOP System 切面 使用 execution 方法 public


一、主要设计注解: @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,System,切面,使用,execution,方法,public
来源: https://blog.csdn.net/weixin_42057591/article/details/117751448

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有