1、概述
什么是AOP,AOP即面向切面编程,和OOP(面向对象编程)类似,也是一种编程思想。
AOP采取横向抽取机制(动态代理),取代了传统纵向继承机制的重要性代码,其应用主要体现在事务处理,日志管理、权限控制、异常处理等方面。主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少业务代码的侵入,增强代码的可读性和可维护性。简单的来说,AOP的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。AOP就是代理模式的典型应用。
2、实现原理
AOP的实现原理是动态代理,提到动态代理,我们就得先了解什么是代理模式。
代理模式
代理模式就是为其他对象提供一种代理以控制这个对象的访问,在某种情况下每一个对象不适合或者不能直接引用另一个对象而代理对象可以在客户端与目标对象之间起到中介作用。
代理模式的组成
1.抽象角色(行为):通过接口或者抽象类声明真实的角色的实现(业务方法)。
2.代理角色(连接真实角色的桥梁):实现抽象角色,是真实角色的代理,通过真实角色的角色业务逻辑方法,来实现抽象方法,附加自己的操作。
3.真实角色(需要被代理的对象):实现抽象角色,定义真实的角色所要实现的业务逻辑,提供代理角色调用。
动态代理实现
动态代理:程序执行过程中,使用JDK的反射机制,创建代理类对象,并动态的指定要代理目标类;它可以实现不用写代理类的实现就可以创建代理类对象;JDK动态代理是基于java的反射机制实现的,使用JDK中接口和类实现代理对象的动态创建;JDK动态代理要求目标对象(被代理类)必须实现接口,这是java设计上的要求,从jdk1.3以来,java通过java.lang.reflect包提供三个类支持代理模式,分别是Proxy,Method和InvocationHandler。
关于动态代理我们就要了解三个类
InvocationHandler接口:处理器,负责完调用目标方法(就是被代理类中的方法),并增强功能;通过代理类对象执行目标接口中的方法,会把方法的调用分派给调用处理器(InvocationHandler)的实现类,执行实现类中的invoke()方法,我们需要把在该invoke()方法中实现调用目标类的目标方法;
Proxy 类:通过 JDK 的 java.lang.reflect.Proxy 类实现动态代理 ,使用其静态方法 newProxyInstance(),依据目标对象(被代理类的对象)、业务接口及调用处理器三者,自动生成一个动态代理对象。
Method 类:Method 是实例化的对象,有一个方法叫 invoke(),该方法在反射中就是用来执行反射对象的方法的。
3、AOP中的定义
Target(目标):指代理的目标对象。
Pointcut(切入点):指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。
Advice(通知):指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。
Joinpoint:连接点指那些被拦截到的点,在 Spring 中,指可以被动态代理拦截目标类的方法。
Weaving(植入):指把增强代码应用到目标上,生成代理对象的过程。
Proxy(代理):指生成的代理对象。
Aspect(切面):切入点和通知的结合。
其中Advice直译为通知,也有的资料翻译为”增强处理“,共有5种类型,分别是
before(前置通知):通知方法在目标方法调用之前执行
after(后置通知):通知方法在目标方法返回或异常后调用
after-returning(返回后通知):通知方法会在目标方法返回后调用
after-throwing(抛出异常通知):通知方法会在目标方法抛出异常后调用
around(环绕通知) 通知方法会将目标方法封装起来
4、AOP的优点
AOP是Spring的核心之一,在Spring中经常会使用AOP来简化编程。在Spring框架中使用AOP主要有以下优势。
1.提供声明式企业服务,特别是作为EJB声明式服务的代替品。最重要的是,这种服务是声明式事务管理。
2.允许用户实现自定义切面。在某些不合适用OOP编程的场景中,采用AOP来补充。
3.可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发。