10.面向切面编程

作者: Lee_java | 来源:发表于2018-09-08 23:03 被阅读0次

    1.相关概念介绍:
    (1)横切关注点:散布于应用中多处的功能。
    (2)切面:横切关注点可以被模块化为特殊的类。
    (3)描述切面的术语有通知,连接点,切点。
    2.使用面向切面编程的好处
    (1)每个关注点都集中于一个地方,而不是分散到多处代码中。
    (2)服务模块更加简洁,因为它们只包含主要关注点的代码,而次要关注点的代码被转移到切面中。
    3.通知advice
    (1)定义:切面的工作被叫做通知。
    (2)spring切面可以应用5种类型的通知
    a.前置通知:在目标方法被调之前调用该通知。
    b.后置通知:在目标方法完成之后调用通知,不关心输出的内容。
    c.返回通知:在目标方法成功执行之后调用通知。
    d.异常通知:在目标方法抛出异常后调用通知。
    e:环绕通知:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
    (3)连接点:就是通知应用的时机。
    (4)连接点是在应用执行过成功能够插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为。
    4.切点
    (1)切点有助于缩小切面所需要通知的连接点的范围。
    (2)切点的定义会匹配通知所要织入的一个或者多个连接点。通常使用明确的类或者方法名称或者利用正则表达式定义所匹配的类和方法名称来指定这些切点。
    5.切面
    (1)切面是通知和切点的结合。通知和切点共同定义了切面的全部内容,是什么以及在什么时间地点完成功能。
    6.引入
    允许我们向现有类添加新方法或者属性。
    7.织入
    把切面应用到目标对象并且创建新的代理对象的过程。切面在指定的连接点处被织入目标对象中。其中目标对象的生命周期中有多个点可以进行织入:
    (1)编译期
    切面在目标类编译的时候就被织入。此方式是AspectJ织入对象的方式。
    (2)类加载期
    切面在目标类加载到JVM时被织入,该方式需要ClassLoader来支持。
    (3)运行期
    切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象。此方式是Spring AOP织入对象的方式。
    8.Spring提供了4中类型的AOP支持:
    (1)基于代理的经典Spring AOP
    (2)纯POJO切面
    (3)@AspectJ注解驱动的切面
    (4)注入式AspectJ切面
    9.因为Spring基于动态代理,所以spring只支持方法连接点。
    10.通过切点来选择连接点
    (1)Spring仅支持AspectJ切点指示器的一个子集,下面列出了Spring AOP所支持的AspectJ切点指示器:
    arg():限制连接点匹配参数为指定类型的执行方法。
    @args():限制连接点匹配参数由指定注解标注的执行方法。
    execution():用于匹配是连接点的执行方法。
    this():限制连接点匹配AOP代理的bean引用为指定类型的类。
    target:限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的位置。
    @target():限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注释
    within():限制连接点匹配指定的类型。
    @within():限制连接点匹配指定注解所标注的类型。
    @annotation:限定匹配带有指定注解的连接点。
    11.我们可以使用execution(* 方法所属类.方法名(..))指示器选择方法。方法表达式以*开头,表示不关心返回值的类型。使用了全限定类名和方法名。方法参数列表用两个点号,表示切点要选择任意的该方法,不管参数是什么。在表达式中我们可以使用&&或者||或者!标识来表示切点需要匹配的具体情况。
    12.spring还引入一个新的bean()指示器,允许我们在切点表达式中使用bean的id来标识bean。bean()使用bean的id或者名称作为参数来限制切点只匹配特定的bean。


    13.切面
    (1)使用@AspectJ注解定义切面,表示该类是一个POJO,而且还是一个切面。
    (2)spring使用AspectJ注解来声明通知的方法有五种,分别是
    a.@After
    b.@Before
    c.@AfterReturning
    d.@AfterThrowing
    e.@Around
    (3)定义切点我们使用@Pointcut注解
    (4)如果用JavaConfig形式来配置需要在类上添加注解@EnableAspectJAutoProxy
    (5)如果使用XML的形式配置,我们需要使用<aop:aspectj-autoproxy>元素。
    14.对于环绕通知,需要注意一下参数ProceedingJoinPoint对象,这个对象必须有,因为你要在通知同通过它来调用被通知的方法,通知方法中可以做任何事情,当要将控制权交给被通知的方法时,他需要调用其proceed()方法。


    切点表达式中定义参数,传入到通知方法中

    15.@DeclareParents注解
    (1)value属性:指定哪种类型的bean要引入该接口。
    (2)defaultImpl属性:指定了为引入功能提供实现的类。
    (3)@DeclareParents注解所标注的静态属性指明了要引入接口。
    16.使用XML来声明切面
    Spring AOP配置元素能够以非侵入性的方式声明切面
    <aop:advisor>:定义AOP通知器。
    <aop:after>:定义AOP后置通知(不管被通知的方法是否执行成功)
    <aop:after-returning>:定义返回通知
    <aop:after-throwing>:定义异常通知
    <aop:around>:定义AOP环绕通知
    <aop:aspect>:定义一个切面
    <aop:aspect-autoproxy>:启用@Aspect注解驱动的切面
    <aop:before>:定义一个AOP前置通知。
    <aop:config>:顶层的AOP配置元素。
    <aop:declare-parents>:以透明的方式为被通知的对象引入额外的接口。
    <aop:pointcut>:定义一个切点

    相关文章

      网友评论

        本文标题:10.面向切面编程

        本文链接:https://www.haomeiwen.com/subject/ndbkgftx.html