AOP切面操作

package com.hxkr.util;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
 * 
     AOP的一些相关概念
        切面(Aspect):是切入点和通知的结合;
        连接点(Joinpoint):类里面可以被增强的方法,这些方法称为连接点;
        增强处理(Advice):指拦截到Joinpoint之后所要做的事情就是通知.
                            通知分为前置通知(@Before),后置通知(@After),异常通知(@AfterThrowing),最终通知(@AfterReturning),环绕通知(切面要完成的功能)(@Around);
        切入点(Pointcut):指我们要对哪些Joinpoint进行拦截的定义
 *
 */
@Aspect
@Component
public class LogInterceptor {
    /**
     * 使用方法:springboot为例
     *           第一步:引入AOP依赖
     *                 <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-aop</artifactId>
                    </dependency>
            第二步:使用@Aspect和@Component注解将一个java类定义为切面类
            第三步:使用@Pointcut定义一个切入点(定义在哪个方法里使用)
            第四步:根据需要在切入点不同位置的切入内容
                               使用@Before在切入点开始处切入内容
                               使用@After在切入点结尾处切入内容
                               使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
                               使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
                               使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
     *                 
     */

    /* 定义一个切入点 */
    /**
     * AspectJ语法
        "execution(* cn.youyinian.controller.v1.*.*(..))"
        指定在执行 cn.youyinian.controller.v1 包中任意类的任意方法之前执行方法增强;
        第一个星号表示返回值不限;
        第二个星号表示类名不限;
        第三个星号表示方法名不限;
        圆括号中的 .. 表示任意个数、类型不限的形参。
     */
    @Pointcut("execution(* com.hxkr.service.*.*(..))")
    private void log() {

    }

    /**
     * 切入点之前的操作
     */
    @Before("log()")
    /**
     * 在切入点前的操作,按order的值由小到大执行
     * 在切入点后的操作,按order的值由大到小执行
     */
    @Order(2)
    private void before() {
        System.out.println("[定时任务]  >>>>>>>>>>>>>>>>>>> 开始");
    }
    
    @Before("log()")
    @Order(1)
    private void after() {
        System.out.println("[定时任务]  >>>>>>>>>>>>>>>>>>> 结束");
    }
}

 

posted @ 2019-05-06 15:45  代码酷  阅读(261)  评论(0编辑  收藏  举报