AOP中的专业术语介绍

一、AOP简介

AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充。

AOP 的主要编程对象是切面(aspect), 而切面是把横切关注点模块化!

在应用 AOP 编程时, 需要定义公共功能, 但可以明确的定义这个功能在哪里应用, 并且不必修改需要使用公共功能的类。 这样以来横切关注点就被模块化到特殊的对象(切面)里.

二、AOP 的好处

每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级

业务模块更简洁, 只包含核心业务代码。

三、AOP 术语

1. 连接点(Joinpoint)

连接点描述的是程序执行的某个特定位置。如一个类的初始化前、初始化后,或者类的某个方法调用前、调用后、方法抛出异常后等等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些特定点就称为连接点。连接点用来定义在目标程序的哪里通过AOP加入新的逻辑。

Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。

连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位

执行点:即程序执行流程中的某个点。如执行某个语句或者语句块、执行某个方法、装载某个类、抛出某个异常……

例如 :UserService#add() 方法执行之前,这个连接点。执行点为 UserService#add()方法本身; 方位为该方法执行前的位置。

2. 切入点(Pointcut)

切入点是一个连接点的过滤条件,AOP 通过切点定位到特定的连接点。每个类都拥有多个连接点:例如 UserService类中的所有方法实际上都是连接点,即连接点是程序类中客观存在的事物。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。
xml配置方式:

    <aop:config>
        <aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
    </aop:config>
3. 通知(Advice)

切面在某个具体的连接点采取的行为或行动,称为通知切面的核心逻辑代码都写在通知中,有人也称之为增强或者横切关注点。通知是切面功能的具体实现,通常是业务代码以外的需求,如日志、验证等,这些被模块化的特殊对象。
常用的通知接口有

  • 前置通知:org.springframework.aop.MethodBeforeAdvice
  • 后置通知:org.springframework.aop.AfterReturningAdvice
  • 异常通知:org.springframework.aop.ThrowsAdvice
    该接口没有要实现的方法,需要自定义一个afterThrowing()方法。
  • 环绕通知:org.aopalliance.intercept.MethodInterceptor

xml配置方式

    <bean id="myMethodBeforeAdvice" class="com.kaka.spring.aop.advice.MyMethodBeforeAdvice"/>
    <aop:config>
        <!--①. 切入点(可以有多个) -->
        <aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
        <!-- ②.各种通知(可以有多个,并且可以加在不同的切入点上) -->
        <aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="myPointcut" />
    </aop:config>

MyMethodBeforeAdvice这个类,实现了MethodBeforeAdvice前置通知接口。

4. 通知器(Advisor)

通知器由一个切入点(pointcut)和一个通知(Advice)组成。通知就是增强的那部分功能代码,如记录日志代码、控制权限代码。

<aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="myPointcut" />
5. 切面(Aspect)

与通知器(advisor)类似都是通知+切入点。区别在于,切面中的类无需实现通知接口,但需要在配置文件中指定类中的方法名;而通知器仅需指定类名即可,因为通知器中的类都实现了通知接口,很明确的知道通知方法是哪个。
xml配置方式

    <bean id="myXmlAspect" class="com.kaka.spring.aop.aspect.MyXmlAspect"/>
    <aop:config>
        <!--①. 切入点(可以有多个) -->
        <aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
        <!--②. 切面(可以有多个) -->
        <aop:aspect ref="myXmlAspect">
            <!--切点与切面中的方法关联 -->
            <aop:around method="aroundMethod" pointcut-ref="myPointcut"/>
        </aop:aspect>
    </aop:config>

MyXmlAspect类无需实现任何通知接口,只需定义一个aroundMethod方法即可,该方法名也可以自定义其他的。
可以理解为:切面就是自定定义的aop对象,通知就是配置中指定的该对象方法。

6. 目标(Target)

被通知的对象(方法)

7. 代理(Proxy)

向目标对象应用通知之后创建的对象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章