springboot+aop

两种实现方法

   方式一:

        使用注解的形式

        1.在springboot启动类的同级或下级创建aop切面类

        

@Aspect
@Component
public class MyAop {}

        2. 配置切点和新闻

// 制定切点(Controller层下的所有public方法)
@Pointcut("execution(public * com.sfac.modules.*.controller.*.*(..))")
// 设置优先级(越小越先)
@Order(1)
public void pt(){}

@Before("pt()")
public void beforeControllerAop(JoinPoint joinPoint){
    log.info("before controller");
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attr.getRequest();
    log.info(request.getContextPath());
    log.info(request.getServletPath());
    log.info(request.getMethod());
}

@Around("pt()")
public Object aroundControllerAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    log.info("around controller");
    return proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
}


@After("pt()")
public void afterControllerAop(JoinPoint joinPoint){
    log.info("after controller");
}

方式二 :

        使用自定义注解的方法

        1.定义一个注解类

@Target({ElementType.METHOD})// 用于描述注解的使用范围
@Retention(RetentionPolicy.RUNTIME)// 声明声明周期注解jvm加载class文件之后,仍然存在
public @interface MyAnnotation {
}

        2.创建一个切面类

@Aspect
@Slf4j
@Component
public class MyAop {

    // 制定切点,切入在自己自定的注解的方法处
    @Pointcut("@annotation(com.sfac.aop.MyAnnotation)")
    @Order(1)
    public void point(){};


    // 使用自定的切入点注解
    @Around("point()")
    public Object aroundAnnotationAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Object o = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
        long endTime = System.currentTimeMillis();
        log.info("使用的时间为{}",(endTime-beginTime));
        return o;
    }

}

 

        3.在所需要添加新闻的方法上加上@MyAnnotation注解即可以插入aop

@GetMapping(value = "/all/cities")
@MyAnnotation
public Result selectCity(){
    return cityService.selectAllCitys();
}

你可能感兴趣的:(java,servlet,spring,spring,boot)