<sup id="sjju3"><noscript id="sjju3"></noscript></sup>
    <big id="sjju3"></big>

  • <blockquote id="sjju3"></blockquote>
    <blockquote id="sjju3"></blockquote>

      <td id="sjju3"></td>

      <big id="sjju3"></big>
        <code id="sjju3"><strong id="sjju3"><dl id="sjju3"></dl></strong></code>
      1. spring aop之链式调用的实现

         更新时间:2019年02月20日 10:18:19   作者:niocoder   我要评论

        这篇文章主要介绍了spring aop之链式调用的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

        概述

        AOPAspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。 Spring AOP采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,Spring AOP提供了对JDK动态代理的支持以及CGLib的支持。本章我们不关注aop代理类的实现,我简单实现一个指定次序的链式调用。

        实现链式调用的

        MethodInterceptor定义拦截器链,MethodInvocation 递归进入下一个拦截器链?#23567;?#31867;图如下:

        MethodInterceptor

        public interface MethodInterceptor {
        
          Object invoke(MethodInvocation invocation) throws Throwable;
        }

        MethodInvocation

        public interface MethodInvocation {
        
          Object proceed() throws Throwable;
        }

        AbstractAspectJAdvice

        抽象类,实现MethodInterceptor

        public abstract class AbstractAspectJAdvice implements MethodInterceptor{
        
          private Method adviceMethod;
        
          private Object adviceObject;
        
          public AbstractAspectJAdvice(Method adviceMethod, Object adviceObject) {
            this.adviceMethod = adviceMethod;
            this.adviceObject = adviceObject;
          }
        
          public Method getAdviceMethod() {
            return this.adviceMethod;
          }
        
          public void invokeAdviceMethod() throws Throwable {
            adviceMethod.invoke(adviceObject);
          }
        }

        AspectJBeforeAdvice

        前置通知

        public class AspectJBeforeAdvice extends AbstractAspectJAdvice {
        
          public AspectJBeforeAdvice(Method method, Object adviceObject) {
            super(method, adviceObject);
          }
        
          @Override
          public Object invoke(MethodInvocation invocation) throws Throwable{
            this.invokeAdviceMethod();
            Object o = invocation.proceed();
            return o;
          }
        }

        AspectJAfterReturningAdvice

        后置通知

        public class AspectJAfterReturningAdvice extends AbstractAspectJAdvice {
        
          public AspectJAfterReturningAdvice(Method method, Object adviceObject) {
            super(method, adviceObject);
          }
        
          @Override
          public Object invoke(MethodInvocation invocation) throws Throwable{
            Object o = invocation.proceed();
            this.invokeAdviceMethod();
            return o;
          }
        }

        ReflectiveMethodInvocation

        实现MethodInvocationproceed()方法递归实现链式调用。

        public class ReflectiveMethodInvocation implements MethodInvocation {
        
          private final Object targetObject;
        
          private final Method targetMethod;
        
          private final List<MethodInterceptor> interceptorList;
        
          private int currentInterceptorIndex = -1;
        
          public ReflectiveMethodInvocation(Object targetObject, Method targetMethod, List<MethodInterceptor> interceptorList) {
            this.targetObject = targetObject;
            this.targetMethod = targetMethod;
            this.interceptorList = interceptorList;
          }
        
          @Override
          public Object proceed() throws Throwable {
        
            if (this.currentInterceptorIndex == this.interceptorList.size() - 1) {
              return invokeJoinPoint();
            }
        
            this.currentInterceptorIndex++;
        
            MethodInterceptor interceptor =
                this.interceptorList.get(this.currentInterceptorIndex);
            return interceptor.invoke(this);
          }
        
          private Object invokeJoinPoint() throws Throwable {
        
            return this.targetMethod.invoke(this.targetObject);
          }
        }

        NioCoderService

        模拟service

        public class NioCoderService {
        
          public void testAop() {
            System.out.println("http://niocoder.com/");
          }
        }

        TransactionManager

        模拟通知类

        public class TransactionManager {
          public void start() {
            System.out.println("start tx");
          }
        
          public void commit() {
            System.out.println("commit tx");
          }
        
          public void rollback() {
            System.out.println("rollback tx");
          }
        
        }

        ReflectiveMethodInvocationTest

        beforeAdvice->afterReturningAdvice

        测试类,测试通知

        public class ReflectiveMethodInvocationTest {
        
          private AspectJBeforeAdvice beforeAdvice = null;
        
          private AspectJAfterReturningAdvice afterReturningAdvice = null;
        
          private NioCoderService nioCoderService;
        
          private TransactionManager tx;
        
          public void setUp() throws Exception {
            nioCoderService = new NioCoderService();
            tx = new TransactionManager();
            beforeAdvice = new AspectJBeforeAdvice(TransactionManager.class.getMethod("start"), tx);
            afterReturningAdvice = new AspectJAfterReturningAdvice(TransactionManager.class.getMethod("commit"), tx);
          }
        
          public void testMethodInvocation() throws Throwable {
            Method method = NioCoderService.class.getMethod("testAop");
            List<MethodInterceptor> interceptorList = new ArrayList<>();
            interceptorList.add(beforeAdvice);
            interceptorList.add(afterReturningAdvice);    
        
            ReflectiveMethodInvocation mi = new ReflectiveMethodInvocation(nioCoderService, method, interceptorList);
        
            mi.proceed();
          }
        
        
          public static void main(String[] args) throws Throwable {
            ReflectiveMethodInvocationTest reflectiveMethodInvocationTest = new ReflectiveMethodInvocationTest();
            reflectiveMethodInvocationTest.setUp();
            reflectiveMethodInvocationTest.testMethodInvocation();
          }
        }

        输出:

        start tx
        http://niocoder.com/
        commit tx

        时序图 beforeAdvice->afterReturningAdvice

        afterReturningAdvice->beforeAdvice

        修改interceptorList的顺序

        public void testMethodInvocation() throws Throwable {
            Method method = NioCoderService.class.getMethod("testAop");
            List<MethodInterceptor> interceptorList = new ArrayList<>();
            interceptorList.add(afterReturningAdvice);
             interceptorList.add(beforeAdvice);
        
            ReflectiveMethodInvocation mi = new ReflectiveMethodInvocation(nioCoderService, method, interceptorList);
        
            mi.proceed();
          }

        输出:

        start tx
        http://niocoder.com/
        commit tx

        时序图 afterReturningAdvice->beforeAdvice

        代码下载

        github:https://github.com/longfeizheng/data-structure-java/blob/master/src/main/java/cn/merryyou/aop

        代码下载

        github:https://github.com/longfeizheng/data-structure-java

        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

        相关文章

        • quartz实现定时功能实例详解(servlet定时器配置方法)

          quartz实现定时功能实例详解(servlet定时器配置方法)

          Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法
          2013-12-12
        • 基于Java中Math类的常用函数总结

          基于Java中Math类的常用函数总结

          下面小编就为大家带来一篇基于Java中Math类的常用函数总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
          2016-09-09
        • springboot的缓存技术的实现

          springboot的缓存技术的实现

          这篇文章主要介绍了springboot的缓存技术的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
          2018-05-05
        • Spring Cloud与分布式系统简析

          Spring Cloud与分布式系统简析

          这篇文章主要介绍了Spring Cloud与分布式系统的相关内容,具有一定参考价值,需要的朋友可以了解下。
          2017-09-09
        • java数组排序示例分享

          java数组排序示例分享

          这篇文章主要介绍了java数组排序示例,需要的朋友可以参考下
          2014-03-03
        • Java 进程执行外部程序造成阻塞的一种原因

          Java 进程执行外部程序造成阻塞的一种原因

          前一阵子在研究文档展示时使用了java进程直接调用外部程序,其中遇到一个问题花了好长时间才解决,这个问题就是外部程序直接执行没什?#27425;?#39064;,但是当使用Java进程执行时外部程序就阻塞在那儿不动了。而且这个外部程序在处理某些文件时使用Java进程执行是没问题的
          2014-03-03
        • Java正则替换手机号代码实例

          Java正则替换手机号代码实例

          本文的主要内容是Java语言中正则表达式替换手机号的第4到第7位,实现方法十分简单,同时涉及了一些正则表达式的相关用法,需要的朋友可以参考下。
          2017-09-09
        • Java生产者消费者模式实例分析

          Java生产者消费者模式实例分析

          这篇文章主要介绍了Java生产者消费者模式,结合实例形式分析了java生产者消费者模式的相关组成、原理及实现方法,需要的朋友可以参考下
          2019-03-03
        • java设计模式之适配器模式

          java设计模式之适配器模式

          这篇文章主要为大家详细介绍了java设计模式之适配器模式,介绍了什?#35789;?#36866;配器模式,适配器模式的种类,?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
          2016-08-08
        • Java 编程之IO流资料详细整理

          Java 编程之IO流资料详细整理

          这篇文章主要介绍了Java 编程之IO流资料详细整理的相关资料,需要的朋友可以参考下
          2017-02-02

        最新评论

        2018白小姐一肖中特马
        <sup id="sjju3"><noscript id="sjju3"></noscript></sup>
        <big id="sjju3"></big>

      2. <blockquote id="sjju3"></blockquote>
        <blockquote id="sjju3"></blockquote>

          <td id="sjju3"></td>

          <big id="sjju3"></big>
            <code id="sjju3"><strong id="sjju3"><dl id="sjju3"></dl></strong></code>
          1. <sup id="sjju3"><noscript id="sjju3"></noscript></sup>
            <big id="sjju3"></big>

          2. <blockquote id="sjju3"></blockquote>
            <blockquote id="sjju3"></blockquote>

              <td id="sjju3"></td>

              <big id="sjju3"></big>
                <code id="sjju3"><strong id="sjju3"><dl id="sjju3"></dl></strong></code>