• Advice详解


    1.前置增强
    BeforeAdvice是前置增强的接口,方法前置增强的MethodBeforeAdvice接口是其子类,
    MethodBeforeAdvice接口仅仅定义了唯一的方法:before(Method method,Object[] args,Object obj) throws Throwable,
    method为目标类的方法;args为目标类方法的入参;而obj为目标类实例。
    当该方法发生异常时,将阻止目标类方法的执行
    2.后置增强
    后置增强在目标类方法调用后执行
    通过实现AfterReturningAdvice来定义后置增强的逻辑,仅仅定义了唯一的方法
    afterReturning(Object returnObj,Method method,Object[] args,Object obj) Throws Throwable
    returnObj为目标实例方法返回的结果;method为目标类的方法;args为目标实例的方法的入参;而obj为目标类实例
    注:假设在后置增强中抛出异常,如果该异常的目标方法声明的异常,则该异常归并到目标方法中
    如果不是目标方法所声明的异常,则Spring将其转为运行期异常抛出
    3.环绕增强
    环绕增强允许在目标类方法调用前后织入横切逻辑,综合实现了前置、后置增强两者的功能
    Spring直接使用AOP联盟所定义的import org.aopalliance.intercept.MethodInterceptor作为环绕增强的接口。
    该接口有唯一的接口方法Object invoke(MethodInvocation invocation) throws Throwable
    MethodInvocattion不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象,
    通过MethodInvocation的getArguments()可以获取目标方法的入参数组,
    通过procced()反射调用目标实例相应的方法
    4.异常抛出增强
    异常抛出增强最适合的应用场景的是事务管理,当参与事务的某个Dao发生异常时,事务管理器就必须回滚事务
    ThrowsAdvice异常抛出增强接口没有定义任何方法,它是一个标识接口,在运行期Spring使用反射的机制自行判断,
    我们必须采用以下签名形式定义异常抛出的增强方法:
    void afterThrowing(Method method,Object[] args,Object target,Throwable th)
    方法名必须为afterThrowing,方法入参规定如下:前三个入参时可选的(要么三个入参提供,要么不提供)
    最后一个入参是Throwable或其子类
    可以在同一个异常抛出增强中定义多个afterThrowing(),当目标类方法抛出异常时,
    Spring会自动选用最匹配的增强方法
    5.引介增强
    引介增强是一种比较特殊的增强类型,它不是在目标方法周围织入增强,而是为目标类创建新的方法和属性
    所以引介增强的连接点是类级别的,而非方法级别的。
    通过引介增强,我们可以为目标类添加一个接口的实现,即原来目标类为实现某个接口,
    通过引介增强可以为目标类创建实现某接口的代理
    Spring定义了引介增强接口IntroductionInterceptor,该接口没有定义任何方法,
    Spring为该接口提供了DelegatingIntroductionInterceptor实现类,
    一般情况下,我们通过扩展该实现类定义自己的引介增强类




  • 相关阅读:
    SpringKafka——消息监听
    RabbitMQ(八)线程池消费
    RabbitMQ(七)延迟队列
    window计划任务 0x1
    获取网页URL地址及参数等的两种方法(js和C#)
    HttpWebRequest的偶尔请求超时问题
    用HTML、CSS、JS制作圆形进度条(无动画效果)
    批量关联update
    仅仅 IE8 有效的 CSS hack 写法
    SqlServer关闭与启用标识(自增长)列
  • 原文地址:https://www.cnblogs.com/xiao2/p/5779431.html
Copyright © 2020-2023  润新知