zoukankan      html  css  js  c++  java
  • AOP常用注解

    1、@Aspect

    • 配置切面Bean,和<bean.../>元素进行配置无区别,一样支持依赖注入来配置属性值;
    • 如果启动了Spring的“零配置”特性,一样可以让Spring自动搜索,并加载指定路径下的切面Bean
    • 使用@Aspect修饰的类(切面类)和其他类一样可以有方法、成员变量定义,还可能包括切入点、增强处理定义
    • 使用@Aspect修饰类,Spring将不会把该Bean当成组件Bean处理,因此负责自动增强的后处理Bean将会略过该Bean,不会对该Bean进行任何增强处理

    2、@Before

    • 修饰一个方法时,该方法将作为Before增强处理
    • 使用@Before修饰事,需要指定一个value属性值,该属性值指定一个切入点表达式(既可以是一个已有的切入点,也可以直接定义切入点表达式),用于指定该增强处理将被织入哪些切入点
    • 表示在切入点执行前需要进行的操作或者需要执行的方法

    3、@After

    • 同Before
    • 表示在切入点执行后,进行哪些操作
    • 通常用于资源释放

    4、@AfterReturning

    • 同上
    • 使用@AfterReturning增强处理可指定如下常用属性
      • pointcut/value:用于指定该切入点对应的切入表达式,当指定了pointcut属性值后,value属性值将会被覆盖
      • returning:该属性值指定一个形参名,用于表示Advuce方法中可以定义与此同名的形参,该形参可用于访问目标方法的返回值
        • 在Advice方法中定义该形参时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值
    • AfterReturning增强处理只有在目标方法成功完成后才会被织入
    • After增强处理不管目标方法时如何结束的(成功或抛出异常),它都会被织入

    5、@AfterThrowing

    • 同上
    • 使用@AfterThrowing注解时可指定如下两个常用属性:
      • pointcut/value:用于指定该切入点对应的切入表达式,当指定了pointcut属性值后,value属性值将会被覆盖
      • throwing:该属性值指定一个形参名,用于表示Advice方法中可以定义与此同名的形参,该形参可用于访问目标方法抛出的异常
      • 在Advice方法中定义该形参时指定的类型,会限制目标方法必须抛出指定类型的异常

    6、@Around

    • Around增强处理是功能比较强大的增强处理;
    • 近似等于Before增强处理和AfterReturning增强处理的总和
    • 既可以在执行目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作
    • Around增强处理可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值
    • Around增强处理虽然功能强大,但通常需要在线程安全的环境下使用,所以一般用Before和AfterReturning增强处理能解决的问题,不建议用Around
    • 如果需要目标方法执行之前和之后共享某种状态数据,则应该考虑使用Around增强处理;尤其是需要改变目标方法的返回值时,则只能使用Around增强处理了
    • @Around增强处理事,需要指定一个value属性,该属性指定该增强处理被植入的切入点
    • 当定义一个Around增强处理方法时,该方法的第一个形参必须是ProceedingJoinPoint类型(至少包含一个形参),在增强处理方法体内,调用ProceedingJoinPoint参数的proceed()方法才会执行目标方法——这就是Around增强处理可以完全控制目标方法的执行时机、如何执行的关键;如果程序没有调用ProceedingJoinPoint参数的proceed()方法,则目标方法不会被执行。
    • 调用ProceedingJoinPoint参数的proceed()方法时,还可以传入一个Object[]对象作为参数,该数组中的值将被传入目标方法作为执行方法的实参
    package com.sysker.aspect;
    
    import java.util.Arrays;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    @Aspect
    public class TxAspect {
        @Around("execution(* com.sysker.impl.*.*(..))")
        public Object changeValue(ProceedingJoinPoint jp) throws Throwable {
            System.out.println("TxAspect执行目标方法之前,模拟开始事务。。。");
            Object[] args = jp.getArgs();
            if(args != null && args.length > 1) {
                args[0] = "change00" + args[0];
            }
            Object rvt = jp.proceed(args);
            System.out.println("TxAspect执行目标方法之后,模拟结束事务。。。");
            if(rvt != null && rvt instanceof Integer) {
                rvt = (Integer)rvt*(Integer)rvt;
            }
            System.out.println(rvt);
            return rvt;
        }
        @Before("execution(* com.sysker.impl.*.*(..))")
        public void authority(JoinPoint jp) {
            System.out.println("TxAspect模拟执行权限检查");
            System.out.println("Before增强:被织入增强处理的目标方法:" + jp.getSignature().getName());
            System.out.println("Before增强:被织入增强处理的目标方法的参数:" + Arrays.toString(jp.getArgs()));
            System.out.println("Before增强:被织入增强处理的目标对象为:" + jp.getTarget());
        }
    
        @After("execution(* com.sysker.impl.*.*(..))")
        public void show() {
            System.out.println("TxAspect模拟释放资源");
        }
        @AfterThrowing(throwing = "ex", pointcut = "execution(* com.sysker.impl.*.*(..))")
        public void doRecoveryAciton(Throwable ex) {
            System.out.println("目标抛出的异常:" + ex);
            System.out.println("模拟Advice对异常进行修复");
        }
        
        
    }
    
    
  • 相关阅读:
    迷宫最短路径问题的dfs,bfs实现
    高效率的排序算法2--归并排序
    高效率的排序算法1--快速排序
    POJ No.2386 Lake Counting
    部分和问题 --dfs
    dfs的一个小实现(啊哈算法的例题)
    HDU 5710 Digit Sum
    【视频播放器】在macOS上使用IINA
    视音频格式基础知识&视频压缩
    影视作品(电影,电视剧,PV,MAD,AMV)的制作程序
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/9247933.html
Copyright © 2011-2022 走看看