首页 > 编程语言 >AOP - AspectJ 示例

AOP - AspectJ 示例

时间:2024-10-20 09:42:38浏览次数:1  
标签:示例 void joinPoint System public AOP println AspectJ out

// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecution {
}

@Aspect // 切面类
@Order(1000) // 数字越小,优先级越高
@Component // 也要注册到容器
public class LoggingAspect {

    // 定义切点
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {}

    // 前通知
    @Before("serviceMethods()")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Executing method...");
        System.out.println("Before method: " + joinPoint.getSignature());
    }

    // 后通知
    @After("serviceMethods()")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("Method execution completed.");
    }

    // 返回通知
    @AfterReturning(pointcut = "serviceMethods()", JoinPoint joinPoint, returning = "result")
    public void logAfterReturning(Object result) {
        System.out.println("Method returned: " + result);
    }

    // 异常通知
    @AfterThrowing(pointcut = "serviceMethods()", throwing = "ex")
    public void logAfterThrowing(Throwable ex) {
        System.out.println("Method threw an exception: " + ex);
    }

    // 环绕通知(四合一通知)
    @Around("serviceMethods()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before..."); // 前通知
        Object[] args = joinPoint.getArgs(); // 参数
        try {
            Object result = joinPoint.proceed(); // 执行目标方法
            System.out.println("AfterReturning"); // 返回通知
        } catch {
            System.out.println("AfterThrowing..."); // 异常通知
        } finally {
            System.out.println("After..."); // 后通知
        }
        return result;
    }

    // 使用自定义注解的通知
    @Before("@annotation(LogExecution)")
    public void logBeforeAnnotatedMethod() {
        System.out.println("Executing annotated method...");
    }
}

标签:示例,void,joinPoint,System,public,AOP,println,AspectJ,out
From: https://www.cnblogs.com/cyrushuang/p/18486959

相关文章

  • 低功耗4G模组:tcs3472颜色传感器示例
    ​今天我们学习合宙低功耗4G模组Air780EP的LuatOS开发tcs3472示例,文末【阅读原文】获取最新资料1一、简介tcs3472颜色传感器能够读取照射到的物体的RGB三种数值,从而识别颜色关联文档和使用工具:LuatOS固件获取tcs3472颜色传感器接口说明Luatools下载调试工具二......
  • 低功耗4G模组:LCD应用示例
    ​今天我们学习合宙Air780E开发板LCD应用示例,文末【阅读原文】获取最新资料。本文档适用于Air780E开发板关联文档和使用工具lcd-demo:https://gitee.com/openLuat/LuatOS/tree/master/demo/lcdLuatools下载调试工具一、环境准备1.1Air780E开发板一套 ​1.......
  • celery简单配置示例
    目录生产者消费者配置信息celery的配置文件示例celer简单示例tree-I'containerd|vminit|__pycache__'.#app.py属于生产者├──app.py#celery_app用于配置消费者及队列信息└──celery_app#confi.py配置信息├──config.py#__init__.pycelery实例初始......
  • java堆排序的示例代码
    publicclassHeapSort{publicstaticvoidmain(String[]args){int[]arr={12,11,13,5,6,7};System.out.println("Originalarray:");for(intvalue:arr){System.out.print(value+"");......
  • RabbitMQ 通配符(Topic)模式示例
    总结自:BV15k4y1k7Ep模式说明Topic类型与Direct相比,都是可以根据Routingkey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routingkey的时候使用通配符!Topic类型的Routingkey一般都是由一个或多个单词组成,多个单词之间以.分隔,例如:item.insert通配符规......
  • RabbitMQ 路由(Routing)模式示例
    总结自:BV15k4y1k7Ep模式说明和消费订阅模式相比,路由模式特点:交换机的类型为Direct。队列与交换机绑定时,要指定一个Routingkey(路由key)。消息的发送方在向Exchange发送消息时,也必须指定消息的Routingkey。Exchange不再把消息交给每一个绑定的队列,而是根据消息的Rout......
  • SpringAop学习笔记
    SpringAop学习笔记文章目录SpringAop学习笔记1.面向切面编程(AOP)1.1代理模式1.2静态代理1.3动态代理2.AOP概念及相关术语2.1概述2.2相关术语①横切关注点②通知(增强)③切面④目标⑤代理⑥连接点⑦切入点2.3作用3.基于注解的AOP3.1技术说明3.2准备工作3.3创......
  • RabbitMQ 发布订阅(Publish Subscribe)模式示例
    总结自:BV15k4y1k7Ep交换机订阅模式示例图:在简单模式和工作队列模式中,只有3个角色:P:生产者,也就是要发送消息的程序。C:消费者,消息的接受者,会一直等待消息到来。Queue:消息队列,图中红色部分。而在订阅模型中,多了一个Exchange角色,而且工作过程略有变化:P:生产者,也就是要......
  • 使用AES 128位加解密,加解密模式采用CBC,填充模式采用PKCS5Padding的Java工具方法示例
    importjavax.crypto.Cipher;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjava.util.Base64;publicclassAESUtils{privatestaticfinalStringAES_ALGORITHM="AES/CBC/PKCS5Padding";private......
  • AOP
    SpringAOPOOP:Object-OrientedProgramming,面向对象编程;AOP:Aspect-OrientedProgramming,面向切面编程Advisor:spring自己的AOP组件;AspectJ:三方实现的AOP组件底层对bean创建代理对象,达到增强目的。如果目标bean实现了接口,就用JDK动态代理;如果没有,就用CGLIB声明式......