Spring_AOP

一、代理模式

  1、代理模式的设计原则:

    ·代理类与委托类具有相似的行为

    ·代理类增强委托类的行为

  

  2、代理模式实现的三要素:

    代理角色、目标角色、共同行为

    实现行为接口,持有目标对象的引用

  3、静态代理和动态代理

    1)静态代理

      特点:程序运行前制作代理角色

         代理目标角色单一

         代理类数量无法控制

    2)动态代理

      程序运行期动态创建代理角色

      ·JDK动态代理,回调方式实现

      ·cglib动态代理,继承方式实现

     区别:

        JDK动态代理:委托类必须要有接口,制作过程较快,执行慢

        Cglib动态代理:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快

二、AOP(面相切面编程)

  AOP的两种实现机制是JDK动态代理和cglib动态代理

    AOP主要应用于日志记录,性能统计,安全控制,事务处理额等方面,实现公共行为的重复使用

    降低模块之间的耦合度,提高业务代码的聚合度(高内聚低耦合)

    提高代码的复用性

    提高系统的扩展性

  Aop基本概念

    Joinpoint(连接点):spring中指被拦截到的每一个方法

    Pointcut(切入点):规定拦截哪些方法,对那些方法进行处理

    Advice(通知):拦截到每一个连接点后要做的操作

      前置通知、返回通知、最终通知、异常通知、环绕通知

    Aspect(切面):切入点与通知的结合

    Target(目标对象):被代理的目标对象

    Weave(织入)

    Introduction(引入)

三、AOP注解实现

  1、XML:引入命名空间,开启aop代理环境

    

  2、Maven项目引入Aspect坐标

  3、创建切面类  @Aspect定义切面类

  4、声明方法为切入点  @Pointcut 匹配规则定义 execution

  5、创建通知方法

    

package com.shsxt02.proxy;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogCut {

    @Pointcut("execution(* com.shsxt02.service..*.*(..))")
    public void cut() {
    }

    @After(value = "cut()")
    public void before(){
        System.out.println("前置通知,目标方法执行前执行...");
    }

    @AfterReturning(value = "cut()")
    public void afterReturn(){
        System.out.println("返回通知,方法正常结束后执行...");
    }

    @After(value = "cut()")
    public void after(){
        System.out.println("最终通知,方法是否发生异常均会执行...");
    }

    @AfterThrowing(value = "cut()",throwing = "e")
    public void afterThrow(Exception e){
        System.out.println("异常通知,异常时执行..."+e);
    }

    // 环绕通知
    @Around(value = "cut()")
    public Object around(ProceedingJoinPoint  pjp) throws Throwable {
        Object result=null;
        System.out.println("环绕前置...");
        System.out.println("环绕通知...");
        System.out.println("方法签名"+pjp.getSignature());
        System.out.println("目标对象"+pjp.getTarget());
        System.out.println("种类"+pjp.getKind());
        Object[] objects=pjp.getArgs();
        for(Object o:objects){
            System.out.println("参数"+o);
        }
        result= pjp.proceed(); // 返回的目标对象
        System.out.println("环绕后置...");
        return result;
    }
}

四、AOP XML配置实现

  

五、AOP拦截注释

  

如果目标角色实现了接口,AOP有代理,返回的是代理对象,需要通过接口接收。

原文地址:https://www.cnblogs.com/dhome/p/9716234.html