快速上手@Aspect+@Pointcut

我就是我 2023-09-25 16:49 173阅读 0赞

1. 解析

@Aspect
AspectJProxyFactory这个类可以通过解析 @Aspect 标注的类来生成代理aop代理对象——手动Aop的方式之一。实现代理的步骤如下:

  • @Aspect 标注一个类,@Pointcut 标注一个方法定义切入点
  • AspectJProxyFactory根据 @Aspect 定义的类,生成代理对象
  • @Before 标注在方法上(此方法只是匹配其他方法的,不会执行里面的内容),定义一个前置通知,并通过value属性去调用 @Pointcut 标注的切入点,会在匹配到的方法执行前去执行前置通知方法
  • @AfterReturning@Before 类似,不过是在匹配到的方法返回后通知
  • 常用的还有 @AfterThrowing 抛出异常通知

@Pointcut(“execution(表达式1(表达式2))”)

  • 表达式1——匹配指定方法
  • 表达式2——匹配指定参数
  • 一些字符:

    • com? —— com可选
    • *——任意值
    • ..——任意参数
    • execution(* com..*(..))——com所有子包中的所有方法
    • execution(* * *(..))——所有方法
    • execution(* t*(..))——所有以t开头的方法
  • 位置:返回类型 包路径.类名.方法(参数)

2. 案例

1. 测试

springboot项目导入依赖:

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.aspectj</groupId>
  8. <artifactId>aspectjweaver</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>

切面:

  1. @Aspect
  2. @Slf4j
  3. public class LogAop {
  4. @Pointcut("execution(* com..*(..))")
  5. public void mate() {
  6. };
  7. @Before("mate()")
  8. public void before(JoinPoint joinPoint) {
  9. log.info("======> 前置处理方法 <=====");
  10. log.info("切入点: =====>" + joinPoint);
  11. }
  12. @AfterReturning(pointcut = "mate()", returning = "returnValue")
  13. public void afterReturn(JoinPoint joinPoint, Object returnValue) {
  14. log.info("======> 后置处理方法 <=====");
  15. log.info("切入点: =====>" + joinPoint);
  16. log.info("返回值: =====>" + returnValue);
  17. }
  18. }

被代理对象:

  1. package com.cj.aop;
  2. import java.math.BigDecimal;
  3. public class AopTestMd {
  4. public String add(BigDecimal a, BigDecimal b) {
  5. return a.add(b).setScale(4, BigDecimal.ROUND_HALF_UP).toString();
  6. }
  7. public void sub(BigDecimal a, BigDecimal b) {
  8. System.out.println(a.subtract(b).setScale(4, BigDecimal.ROUND_HALF_UP).toString());
  9. }
  10. }

测试类:

  1. public class LogAopTestMd {
  2. @Test
  3. public void testAop() {
  4. // 代理的目标对象
  5. AopTestMd target = new AopTestMd();
  6. // 构建 AspectJProxyFactory 对象
  7. AspectJProxyFactory proxyFactory = new AspectJProxyFactory();
  8. // 设置被代理的目标对象
  9. proxyFactory.setTarget(target);
  10. // 设置标注了@Aspect注解的类
  11. proxyFactory.addAspect(LogAop.class);
  12. // 生成代理对象
  13. AopTestMd proxy = proxyFactory.getProxy();
  14. proxy.add(new BigDecimal("3.14"), new BigDecimal(0.5099));
  15. proxy.sub(new BigDecimal(4.00), new BigDecimal(1));
  16. }
  17. }

输出:
4218aa65f8634fa48db38eebf0fbcf4d.png

2. 实际

在实际开发环境中,因为springboot的自动装配,我们完全不用去管AspectJProxyFactory对象的生成与代理对象的生成的过程,只需要写好切面并注册到容器中就可以了。只需要给切面类加上@Configuration或者@Component

  1. @Aspect
  2. @Component
  3. @Slf4j
  4. public class LogAop {
  5. @Pointcut("execution(* com..*(..))")
  6. public void mate() {
  7. };
  8. @Before("mate()")
  9. public void before(JoinPoint joinPoint) {
  10. log.info("======> 前置处理方法 <=====");
  11. log.info("切入点: =====>" + joinPoint);
  12. }
  13. @AfterReturning(pointcut = "mate()", returning = "returnValue")
  14. public void afterReturn(JoinPoint joinPoint, Object returnValue) {
  15. log.info("======> 后置处理方法 <=====");
  16. log.info("切入点: =====>" + joinPoint);
  17. log.info("返回值: =====>" + returnValue);
  18. }
  19. }

发表评论

表情:
评论列表 (有 0 条评论,173人围观)

还没有评论,来说两句吧...

相关阅读

    相关 快速上手Navicat~

    > 众所周知, Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用,使用起来方便快捷,简洁。下面我会简单的讲一下其安装以及使用的方法。并且会附带相关的永久安装

    相关 快速上手Navicat~

    > 众所周知, Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用,使用起来方便快捷,简洁。下面我会简单的讲一下其安装以及使用的方法。并且会附带相关的永久安装

    相关 Nginx快速上手下篇

    Nginx快速上手 根据实际的应用需要,学习要用到的Nginx的知识,以快速上手、理解并掌握Nginx 六:学习反向代理、动静分离、负载均衡、Geo和GeoIP模块 七:学习R