zoukankan      html  css  js  c++  java
  • Spring的5种通知

    1.前置通知  Before advice

     Advice that executes before a join point, but which does not have the ability to prevent execution flow proceeding to the join point (unless it throws an exception).

    2.后置通知  After (finally) advice

    Advice to be executed regardless of the means by which a join point exits (normal or exceptional return).                     

    3.返回通知  After returning advice

    Advice to be executed after a join point completes normally: for example, if a method returns without throwing an exception.

    4.异常通知  After throwing advice

    Advice to be executed if a method exits by throwing an exception.

    5.环绕通知  Around advice

     Advice that surrounds a join point such as a method invocation. This is the most powerful kind of advice. Around advice can perform custom behavior before and after the method invocation. It is also responsible for choosing whether to proceed to the join point or to shortcut the advised method execution by returning its own return value or throwing an exception.

    一.前置通知

    Before advice is declared in an aspect using the @Before annotation:

     1 import org.aspectj.lang.annotation.Aspect;
     2 import org.aspectj.lang.annotation.Before;
     3 
     4 @Aspect
     5 public class BeforeExample {
     6 
     7     @Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
     8     public void doAccessCheck() {
     9         // ...
    10     }
    11 
    12 }

    If using an in-place pointcut expression we could rewrite the above example as:

     1 import org.aspectj.lang.annotation.Aspect;
     2 import org.aspectj.lang.annotation.Before;
     3 
     4 @Aspect
     5 public class BeforeExample {
     6 
     7     @Before("execution(* com.xyz.myapp.dao.*.*(..))")
     8     public void doAccessCheck() {
     9         // ...
    10     }
    11 
    12 }

    二.后置通知

    After (finally) advice runs however a matched method execution exits. It is declared using the @After annotation. After advice must be prepared to handle both normal and exception return conditions. It is typically used for releasing resources, etc.

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.After;
    
    @Aspect
    public class AfterFinallyExample {
    
        @After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
        public void doReleaseLock() {
            // ...
        }
    
    }

    三.返回通知

    After returning advice runs when a matched method execution returns normally. It is declared using the @AfterReturning annotation:

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.AfterReturning;
    
    @Aspect
    public class AfterReturningExample {
    
        @AfterReturning("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
        public void doAccessCheck() {
            // ...
        }
    
    }

    Sometimes you need access in the advice body to the actual value that was returned. You can use the form of @AfterReturning that binds the return value for this:

     1 import org.aspectj.lang.annotation.Aspect;
     2 import org.aspectj.lang.annotation.AfterReturning;
     3 
     4 @Aspect
     5 public class AfterReturningExample {
     6 
     7     @AfterReturning(
     8         pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
     9         returning="retVal")
    10     public void doAccessCheck(Object retVal) {
    11         // ...
    12     }
    13 
    14 }

    四.异常通知

    After throwing advice runs when a matched method execution exits by throwing an exception. It is declared using the @AfterThrowing annotation:

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.AfterThrowing;
    
    @Aspect
    public class AfterThrowingExample {
    
        @AfterThrowing("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
        public void doRecoveryActions() {
            // ...
        }
    
    }

    Often you want the advice to run only when exceptions of a given type are thrown, and you also often need access to the thrown exception in the advice body. Use thethrowing attribute to both restrict matching (if desired, use Throwable as the exception type otherwise) and bind the thrown exception to an advice parameter.

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.AfterThrowing;
    
    @Aspect
    public class AfterThrowingExample {
    
        @AfterThrowing(
            pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
            throwing="ex")
        public void doRecoveryActions(DataAccessException ex) {
            // ...
        }
    
    }

    五.环绕通知

    The final kind of advice is around advice. Around advice runs "around" a matched method execution. It has the opportunity to do work both before and after the method executes, and to determine when, how, and even if, the method actually gets to execute at all. Around advice is often used if you need to share state before and after a method execution in a thread-safe manner (starting and stopping a timer for example). Always use the least powerful form of advice that meets your requirements (i.e. don’t use around advice if simple before advice would do).

    Around advice is declared using the @Around annotation. The first parameter of the advice method must be of type ProceedingJoinPoint. Within the body of the advice, calling proceed() on the ProceedingJoinPoint causes the underlying method to execute. The proceed method may also be called passing in an Object[]- the values in the array will be used as the arguments to the method execution when it proceeds.

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.ProceedingJoinPoint;
    
    @Aspect
    public class AroundExample {
    
        @Around("com.xyz.myapp.SystemArchitecture.businessService()")
        public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
            // start stopwatch
            Object retVal = pjp.proceed();
            // stop stopwatch
            return retVal;
        }
    
    }
  • 相关阅读:
    关于sencha touch中给文本添加焦点无效的解决方案
    sencha touch 入门系列 (五)sencha touch运行及代码解析(上)
    关于用phonegap 3.0+ 打包后sencha touch按钮点击切换动画延迟接近一秒的以及界面闪烁的解决方案
    Building a Simple User Interface(创建一个简单的用户界面)
    Running Your App(运行你的应用程序)
    android GridLayout布局
    Android Studio SVN的使用
    Android Library项目发布到JCenter最简单的配置方法
    AndroidStudio项目提交(更新)到github最详细步骤
    Android RecyclerView的使用
  • 原文地址:https://www.cnblogs.com/gy19920604/p/5288417.html
Copyright © 2011-2022 走看看