Spring AOP框架理解

  学习完Spring容器之后,接下来我们进入到Spring AOP这个核心概念的理解;本文是个人看书后的理解,如有错误的地方,欢迎指正!

   Spring框架的强大之处在于为java的后台开发几乎考虑到所有真实业务场景中的可能需求,如下面要介绍的AOP(面向切面编程)就是我们在系统开发中使用的核心功能;什么是面向切面编程,Java的对象我们称之为OOP(面向对象编程);那么面向切面编程可以理解为我们的系统中的功能模块(比如常见电商系统中的用户模块,订单模块,物流模块,后台管理模块),比如线上系统都需要日志来记录运行过程中的异常,又或者需要针对部分访问增加权限控制,这些属于公共模块的功能如果在系统中以代码的形式每个模块都写一份,后期系统的维护就带来很大的重复工作,所以spring提供AOP这种切面编程的机制来实现对整个系统的切入,抽取出公共代码,以横切面的形式织入到需要使用的地方;

    AOP的原理:

         静态代理:被代理类和代理类同时实现一个接口,并且被代理类中包含代理类的实例作为属性,当方法调用被代理对象的方法后,除了执行真正代理类的方法以外,被代理类还会在前后增加响应的处理,被称为静态代理;弊端就是如果每一个被代理类都需要单独一个代理类来实现,代码的数量会成倍增加,系统的解耦性差,维护困难;

         动态代理:

             Jdk动态代理:和静态代理一样,被代理类和代理类都需要实现一个共同的接口,但是JDK提供InvocationHandler这个接口,只需要实现这个接口,并重写对应的invoke方法;

然后将被代理对象传入该实现类,通过proxy.newProxyInstance()方法生成代理对象,代理对象就可以执行被代理对象的方法啦。JDK动态代理的特点是必须有共同实现的接口;原理是通过反射生成代理类的匿名实现类,再调用invoke方法执行真正的代理方法;

           CGlib动态代理:CGlib动态代理通过继承父类,并覆写父类方法来实现方法的增强,底层用的是字节码的形式实现;通过实现MethodInterceptor接口;

限于本人使用aop代理的场景不多;这里主要介绍基于注解的方式实现aop;

首先介绍aop中的几个核心概念:

joinPoint:连接点,可以理解为动态代理的位置,一般在spring中动态代理的最小单元是类的方法级别;

pointCut:切入点,切入点是特殊的joinPoint,代表要实现增强的位置,也一般是某个具体方法;

Advice:增强,分为beforeAdive(前置增强),afterAdvice(后置增强),afterThrowingAdivce(抛出异常后增强),AfterReuningAdivce(返回时增强),atoundAdvice(环绕增强);

aspect:切面,切面就是由pointCut和adivce组合在一起就叫做切面,意思在哪个方法位置做什么样的增强,就是切面的功能,一个切面可以包含多个pointcut和advice;

 

       

上一篇:java面试题总结


下一篇:Pointcut注解表达式@target、@annotation、@within、this、target、within等