AOP面向切面

  1. 切面(Aspect)
    切面是一个关注点的模块化,如事务管理就是一个在JavaEE企业中应用最常见的界面。在企业应用编程中,首先需要通过分析,抽取出通用的功能,即“切面”。
    事务、日志、安全性的框架、权限都是切面
  2. 连接点(Joinpoint)
    连接点是执行程序过程中的特定的点。Spring框架只支持方法作为连接点,如方法调用之前、方法调用后、或者发生异常时等。
  3. 通知(Advice)
    通知就是切面的具体实现。通知将在切面的某个特定的连接点上执行动作,Spring中执行的动作往往就是调用某一个类的具体方法。例如:在保存订单的模块中,进行日志管理(一个切面),具体是在保存订单的方法执行之前(连接点)执行写日志(通知)的功能。其中,日志管理是很多模块中通用的功能,因此这就是一个切面,而具体是在保存订单之前执行日志保存,那么保存订单前这个点就是连接点,实现日志保存功能的类就是通知。
    就是切面中的方法。
  4. 切入点(Pointcut)
    切入点是连接点的集合,通知将在满足一个切入点表达式的所有连接点上运行。
    举例:
    在拦截器中,有一系列判断性的内容

    1
    if(method.equals("savePerson")||method.equals("updatePerson") ||method.equals("deletePerson")){ ... }

    满足了上面三个方法才能开启事务,这些判断条件就为切入点

  5. 引入(Introduction)
    引入的意思是在一个类中加入新的属性或者方法。
  6. 目标对象(Target Object)
    被一个或多个切面所通知的对象成为目标对象。
  7. AOP代理(AOP Proxy)
    AOP代理是AOP框架所生成的对象,该对象是目标对象的代理对象。代理对象能够在目标对象的基础上,在相应的连接点上调用通知。
  8. 织入(Weaving)
    把切面连接到其他的应用程序之上,创建一个被通知的对象的过程,被称为织入。
    1. AOP两种实现模式

      xml形式

      举例说明如何在applicationContext.xml中配置AOP(因为当前只负责介绍AOP实现模式,因此配置环境需要的jar包先不介绍)

      举例说明

      创建接口personDAO和实现类personDaoImpl
      1
      2
      3
      4
      5
      6
      public interface PersonDao {
      /**
      * 目标方法
      */

      public void savePerson();
      }
    1
    2
    3
    4
    5
    public class PersonDaoImpl implements PersonDao{
    public void savePerson() {
    System.out.println("save person");
    }
    }

    事务处理类Transaction

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Transaction {
    public void beginTransaction(){
    System.out.println("begin transaction");
    }

    public void commit(){
    System.out.println("commit");
    }
    }

    接下来最重要的就是AOP的配置文件,applicationContext.xml。通过配置AOP可以实现创建代理对象:代理对象的方法=目标方法+通知。将原本不相关的目标方法和通知结合起来。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <bean id="personDao" class="cn.zju.spring.PersonDaoImpl"></bean>
    <bean id="transaction" class="cn.zju.spring.Transaction"></bean>

    <aop:config>
    <!--
    切入点表达式
    确定目标类
    id 标示
    -->

    <aop:pointcut expression="execution(* cn.zju.spring.PersonDaoImpl.*(..))" id="perform"/>
    <aop:aspect ref="transaction"> <!-- ref指向切面类 -->
    <aop:before method="beginTransaction" pointcut-ref="perform"/> <!--前置通知 -->
    <aop:after-returning method="commit" pointcut-ref="perform"/> <!--后置通知 -->
    </aop:aspect>
    </aop:config>

    客户端代码

    1
    2
    3
    4
    5
    public static void main(String[] args){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    PersonDao personDao = (PersonDao)context.getBean("personDao");
    personDao.savePerson();
    }

    实现原理

    1. 当启动Spring容器时,因为声明了两个bean,… 所以Spring容易会为这两个bean创建对象。
    2. 当Spring解析到aop:config的时候,解析切入点表达式,让切入点表达式和Spring容器中的bean做匹配
    3. 如果匹配成功则为该类创建代理对象:代理对象的方法=目标方法+通知
    4. 在客户端通过getBean在Spring容器中查找相应对象,如果有代理对象则返回代理对象,否则返回对象本身。

猜你喜欢

转载自blog.csdn.net/weixin_37721347/article/details/80173959
今日推荐