AOP的理解以及AOP核心概念

一.对AOP的理解

可以直接看倒数第二段。

AOP可以应用于统计各个业务层方法执行耗时,记录系统的操作日志,权限控制等场景,来进行代码的优化。这些功能需要编写的代码都是一样的,并且都要在每个方法中编写,可以利用AOP技术,将这些在每个方法中重复代码从多个方法中抽取出来,从而达到优化代码的目的。这部分相同的代码可以放在一起修改,统一管理,达到非侵入式修改和解耦的目的。

化抽象为形象,最好的就是例子。下面先举个AOP的案例,看看实现统计各个业务层方法执行耗时并打印日志(注:通过统计执行耗时,可以看看哪个方法耗时久,以便对耗时久的方法进行优化)这个功能编写代码时是怎么在spring是怎么采用AOP思想进行优化的,有什么好处。

原先,我们要在每一个方法的前面添加代码获取到这个方法的开始时间,在每个方法的后面添加代码获取每个方法的结束时间,开始时间-结束时间得到结果并打印日志。但是缺点是要在每个方法的前面和后面都添加这样子的代码。例:

@Override
public List<Dept> list() {
    //1.记录开始时间
    long begin=System.currentTimeMillis(); 
    //2.调用原始方法运行
    List<Dept> deptList = deptMapper.list();
    //3.记录结束时间,计算方法执行耗时 
    long end=System.currentTimeMillis(); 
    log.info(joinPoint.getSignature()+"方法执行耗时:()ms",end-begin); 
    return result;
}
@Override 
public List<Dept> list() {
        //1.记录开始时间
         long begin=System.currentTimeMillis();
         //2.调用原始方法运行 
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());
        deptMapper.save(dept);
         //3.记录结束时间,计算方法执行耗时
          long end=System.currentTimeMillis();
          log.info(joinPoint.getSignature()+"方法执行耗时:()ms",end-begin);
          return result; 
}

运用AOP技术在这基础上进行优化,我们可以定义一个切面方法,将函数中非共性的代码(或者说与核心业务有关的代码)进行抽象,比如说spring中抽象为Object result=joinPoint.proceed();这样原来的代码就形成切面代码,例:

@Component
@Slf4j
@Aspect//AOP类
public class TimeAspect {
    @Around("execution(* com.itheima.service.*.*(..))")//切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws  Throwable{
        //1.记录开始时间
        long begin=System.currentTimeMillis();
        //2.调用原始方法运行
        Object result=joinPoint.proceed();
        //3.记录结束时间,计算方法执行耗时
        long end=System.currentTimeMillis();
        log.info(joinPoint.getSignature()+"方法执行耗时:()ms",end-begin);
        return result;
    }
}

上面的切入点表达式代表要应用于哪些方法,@Around是环绕方式。通过这个切面方法的定义,我们就可以将多个类的重复代码(或者说与业务层无关的代码)提取。

与OOP一样,面向切面编程也是对方法的进一步分类和抽象。

面向对象是以对象为依据将函数抽象和分类。

同理,面向切面是以切面为依据将函数分类和抽象。

什么是切面?就像平时生物中提到的横切面和纵切面之类的,也可以理解成数学中的截面。比如,对大豆进行切面,你可以发现它有胚轴,胚芽,胚根,子叶,种皮等内部结构。

面向切面像是对方法进行解剖,把代码分为重复代码和非重复代码的结构。对多个方法中的重复代码进行提取,对非重复代码进行抽象,将多个方法进一步抽象分类为同一个切面方法。这样就可以实现代码的统一管理(解耦)和修改时不用去动到非重复的核心代码。

最后拿生活举个例子:
就是说打开书包,拿出作业,写作业,盖上作业,关闭书包
还有打开书包,拿出零食,吃完零食,扔掉零食,关闭书包
这两个方法
可以抽象为打开书包,做自己的事,关闭书包。

说白了就是抽取的思想,其实框架也是在干这样的事,将无关重复的事情抽取出来让程序员只要专注编写业务逻辑代码即可,注解开发的时候也常常把相同的注解抽取出来,思想是相同的。但是游戏开发倒是很少用到AOP,感觉可能是一是因为它没有上述场景,二是因为这些反而会降低游戏的运行效率,适得其反。

二.AOP核心概念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值