• Spring AOP如何使用AspectJ注解进行开发呢?


    转自:

    Spring AOP如何使用AspectJ注解进行开发呢?

    下文讲述Spring AspentJ中采用注解的方式定义切面、切入点和增强处理的示例

    Annotation注解

    注解名称备注
    @Aspect用于定义一个切面
    @Pointcut用于定义一个切入点
    @Before用于定义前置通知,相当于 BeforeAdvice
    @AfterReturning用于定义后置通知,相当于 AfterReturningAdvice
    @Around用于定义环绕通知,相当于MethodInterceptor
    @AfterThrowing用于定义抛出通知,相当于ThrowAdvice
    @After用于定义最终final通知,不管是否异常,该通知都会执行
    @DeclareParents用于定义引介通知,相当于IntroductionInterceptor

    启用 @AspectJ 注解有以下两种方法

    方式一、使用@Configuration和@EnableAspectJAutoProxy注解

    @Configuration 
    @EnableAspectJAutoProxy
    public class Appconfig {
    }
    

    方式二、基于XML配置
    在 XML 文件中添加以下内容启用 @AspectJ

       
    

    定义切面@Aspect

    AspectJ 类和其它普通的 Bean 一样,可以有方法和字段,不同的是 AspectJ 类需要使用 @Aspect 注解,如下:

    package com.java265;
    import org.aspectj.lang.annotation.Aspect;
        @Aspect
        public class AspectModule {
    }
    其效果类似于xml配置
    
    
       ...
    
    
    

    定义切入点@Pointcut

    @Pointcut 注解用来定义一个切入点,如
    // 要求:方法必须是private,返回值类型为void,名称自定义,没有参数

       @Pointcut("execution(*com.java265..*.*(..))") 
       private void myPointCut() {
       }
    
    类似于以下xml配置
     
    

    定义通知advice

    @AspectJ 支持 5 种类型的 advice,以下为使用 @Before 的示例。
    @Before("myPointCut()")
    public void beforeAdvice(){
        ...
    }
    

    1. 创建 SpringDemo 项目
    2. 在 src 目录下创建 com.java265 包
    3. 导入 Spring 相关 JAR 包及 Aspectjrt.jar、Aspectjweaver.jar、Aspectj.jar
    4. 在 com.java265 包下创建 Logging、Man、Beans.xml 和 MainApp
    5. 运行 SpringDemo 项目

    Logging 类

    package com.java265;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    @Aspect
    public class Logging {
        /**
         * 定义切入点
         */
        @Pointcut("execution(* com.java265.*.*(..))")
        private void selectAll() {
        }
        /**
         * 前置通知
         */
        @Before("selectAll()")
        public void beforeAdvice() {
            System.out.println("前置通知");
        }
        /**
         * 后置通知
         */
        @After("selectAll()")
        public void afterAdvice() {
            System.out.println("后置通知");
        }
        /**
         * 返回后通知
         */
        @AfterReturning(pointcut = "selectAll()", returning = "retVal")
        public void afterReturningAdvice(Object retVal) {
            System.out.println("返回值为:" + retVal.toString());
        }
        /**
         * 抛出异常通知
         */
        @AfterThrowing(pointcut = "selectAll()", throwing = "ex")
        public void afterThrowingAdvice(IllegalArgumentException ex) {
            System.out.println("这里的异常为:" + ex.toString());
        }
    }
    
    

    Man 类

    package com.java265;
    public class Man {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public void throwException() {
            System.out.println("抛出异常");
            throw new IllegalArgumentException();
        }
    }
    

    Beans.xml

    
    
        
        
            
            
        
        
    
    

    MainApp 类

    package com.java265;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class MainApp {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
            Man man = (Man) context.getBean("man");
            man.getName();
            man.getAge();
            man.throwException();
        }
    }
    

    运行结果---
    前置通知
    后置通知
    返回值为:java265
    前置通知
    后置通知
    返回值为:88
    前置通知
    抛出异常
    后置通知
    这里的异常为:java.lang.IllegalArgumentException

  • 相关阅读:
    4路光栅尺磁栅尺编码器解码转换5MHz高速差分信号转Modbus TCP网络模块 YL97-RJ45
    前端实现实时消息提醒消息通知
    TypeError: ‘005393.jpg‘ has type str, but expected one of: bytes
    ThreadLocal线程变量使用浅解
    security加密解密
    ES 查询时提示:all shards failed [type=search_phase_execution_exception]
    Unity开发之C#基础-集合(字典)(Dictionary)
    Shiro学习笔记_02:shiro的认证+shiro的授权
    比特币是如何转账的——比特币区块链的五个技术性细节
    利用 member update 实现 etcd 灾难恢复 [ 也可实现 etcd 集群迁移 ]
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127682271