AOP测量业务层接口万次执行效率

相对着spring整合mybats写的,然后测试的是整合后的业务逻辑层中的增删改查方法的万次执行效率 

代码演示如下所示:

AppTest:

SpringConfig:

AccountDao:

package com.itheima.dao;

import com.itheima.domain.Account;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface AccountDao {

    @Insert("insert into tbl_account(name,money)values(#{name},#{money})")
    void save(Account account);

    @Delete("delete from tbl_account where id = #{id} ")
    void delete(Integer id);

    @Update("update tbl_account set name = #{name} , money = #{money} where id = #{id} ")
    void update(Account account);

    @Select("select * from tbl_account")
    List<Account> findAll();

    @Select("select * from tbl_account where id = #{id} ")
    Account findById(Integer id);
}

AccountService接口:(其实这个接口写的代码和AccountDao数据层是一样的,只不过是以获取该AccountServiceImpl对象为例调用增删改查的方法的,因为不能直接管理AccountDao对象,因为有sql语句注解)

 AccountServiceImpl:

通知类:

注意:我们因为演示的就是业务逻辑层中的增删改查方法万次执行所消耗的时间,所以execution(* com.itheima.service.*Service.*(..)) 这样写  (注意:虽然增删改查的细节代码是在实现接口的Impl类中写的,但是这里还是要到接口下然后到接口中的方法名中)

package com.itheima.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 *  ProjectAdvice为通知类
 *  我们这里演示的就是:共性功能就是测试万次速率
 */

@Component  // 通知类必须配置成spring管理的bean
@Aspect // 该注解的目的:是让spring知道这个ProjectAdvice类是专门储存处理共性功能方法的类

public class ProjectAdvice {

    /**
     *  第二步:设置切入点(也就是说:这个共性功能是谁想用的)
     *
     *  execution(* com.itheima.service.*Service.*(..))
     *      首先我们演示的就是:测试业务逻辑层万次执行的效率 我们业务逻辑层中写的是对数据库的增删改查的方法
     *      (save、delete、update、findAll、findById)
     *      因此我们返回值类型会有所不同所以用 ”*“代替 表示:任意一个
     *      *Service:是因为我们的业务逻辑层以后开发中可能会有很多的接口:这里是AccountService接口
     *      .*: 是因为我们想让增删改查的方法中都能调用到这个共性的功能(测量万次效率的功能),所以用”*“ 代替任意方法
     *      (..):因为增删改查方法中有的有参数,有的没有参数,所以不确定的情况下我们就用通配符.. 代表:任意
     *
     */
    @Pointcut("execution(* com.itheima.service.*Service.*(..))") // 匹配业务层的所有方法
    private void pt(){}

    /**
     *  第一步:把共性功能【测试万次效率的功能】写在一个单独的方法中
     */
    @Around("pt()")
    public void runSpeed(ProceedingJoinPoint pjp) throws Throwable {
        // 开始执行时间
        long start =System.currentTimeMillis();

        for (int i = 0; i<10000;i++){
            // Object o =pjp.proceed();
            // 因为是在for循环体里面,因此我们不用再接收返回值类型了,毕竟我们只是测业务逻辑层方法的万次执行时间
            // 又不需要拿到返回的类型,因此可以不用要返回值类型
            pjp.proceed();    // 因为测试程序中获取到bean对象后,调用的是findById()法,
                             // 所以pjp.proceed();这里就相当于一直调用findById方法一万次
        }


        // 万次结束执行时间
        long end =System.currentTimeMillis();

        System.out.println("业务层接口万次执行时间:"+(end-start) + "ms");
    }

}

测试结果如下所示:

再次优化通知类:

 

 思考:为什么我们切入点格式:@Pointcut("execution(* com.itheima.service.*Service.*(..))")

使用通配符写的,我们没有准确的确定到findById()方法中,但是它能知道我们执行的是findById方法呢: 

可能是因为我们AppTest程序测试过程中通过bean对象调用的是findById方法,所以它能知道我们执行的是findById方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值