利用aop攔截注解獲取方法的運行時間


一直對aop的理解不是很深,前天有個需求 就是要獲得多個方法的運行時間總不能每個方法的運行前后都加上時間吧 這個時候aop就很方便了 剛開始的時候用的切入點 弄完以后發現一個問題,切入點用着很不方便。假如我想看看另個包中的方法運行時間,是不是就要重新配置下切入點。而且我只想知道一個類中某個方法的運行時間其他的方法我不想獲取到,顯然用切入點比較局限。我在網上爬了些資料改進成用注解實現aop。廢話不多說上代碼。

1. 自定義一個注解類

 1 /**
 2  * 用來獲得方法執行時間的注解
 3  */
 4 @Target({ElementType.METHOD})
 5 @Retention(RetentionPolicy.RUNTIME)
 6 @Documented
 7 @Inherited
 8 public @interface  RunTime {
 9 
10 }

2.定義一個aop切面(我這里有兩種實現方式    (1)Around用的是我自定義需要攔截的注解。(2)BeforeAfter用的是切入點)

@Aspect
@Component
public class MethodTimeMonitor {
    private long startTime;

    //聲明切面類路徑,類型必須為final String類型的,注解里要使用的變量只能是靜態常量類型的
    //public static final String POINT = "execution(* com.web.service.*.*(..))";
    //也可以使用注解聲明切入點,如下
    @Pointcut("execution(* com.web.system.service.*.*(..))")
    public void point() {
    }

    @Before("point()")
    public void doBefore() {
        this.startTime = System.currentTimeMillis();
    }

    @After("point()")
    public void doAfter() {
        //接收到請求,記錄請求內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        long endTime = System.currentTimeMillis();
        System.out.println(request.getMethod()+"方法執行了" +(endTime - this.startTime) + "ms");
    }
    @Around("@annotation(runTime)")
    public Object doAround(ProceedingJoinPoint pjp, RunTime runTime){
        long startTime = System.currentTimeMillis();
        Object obj = null;
        try {
            obj = pjp.proceed();
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
        System.out.println(methodName+"方法執行了"+(endTime-startTime)+"ms");
        return obj;
    }

3.自定義注解的使用(我們想知道哪個方法的運行時間 只需要在這個方法上面加上我們自定義注解@RunTime就可以了)

 1 /**
 2      * 后台菜單頁面分頁查詢
 3      * @param page
 4      * @param limit
 5      * @param menu_name
 6      * @return
 7      */
 8     @RequestMapping("getAllMenu")
 9     @ResponseBody
10     @RunTime
11     public ResultMap getAllMenu(@RequestParam Integer page, @RequestParam Integer limit, @RequestParam(required = false) String menu_name) {
12         ResultMap<List<Menu>> resultMap = new ResultMap<>();
13         Page<Menu> pageInfo = new Page<>(page, limit);
14         Wrapper<Menu> wrapper = new EntityWrapper<>();
15         wrapper = menu_name == null ? wrapper : wrapper.like("menu_name", menu_name);
16         List<Menu> menuList = dao.selectPage(pageInfo, wrapper.orderBy("id", false)).getRecords();
17         resultMap.setData(menuList);
18         resultMap.setCount(dao.selectCount(wrapper));
19         return resultMap;
20     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM