springboot使用AOP

15 篇文章 0 订阅
1 篇文章 0 订阅

springboot使用AOP

概述

AOP是一种编程范式,与语言无关,是一 种程序设计思想 ;
面向切面 (AOP): Aspect Oriented Programming
面向对象 (OOP) :Object Oriented Programming
面向过程 (POP) :Procedure Oriented Programming

使用案例:

  • pom
  <!-- aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  • 创建aop类
package com.ucare.mall.aop;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
/**service层的aop增强
 */
@Aspect//aop必须注解
@Configuration//注入spring
public class ServiceAop {
    private final static Logger  logger=LoggerFactory.getLogger(ServiceAop.class);//使用日志
    //设置增强的方法----
    //service层所有方法都调用
   //Pointcut定义公用方法execution可以被其他注解使用
    @Pointcut("execution(public * com.ucare.mall.service.*.*(..))")  //具体到每一个方法
    public void webLog(){} 

    @Around("webLog()")//环绕,或者此处直接写"execution(public * com.ucare.mall.service.*.*(..))"
    public void ServiceAopAround(ProceedingJoinPoint pro) throws Throwable {
        //logger.info("pre handle");//日志
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date start=new Date();
        //执行前时间
        logger.info("开始时间:"+(sdf.format(start)));//日志
        //调用方法
        pro.proceed();
        //执行后时间
        Date stop=new Date();
        logger.info("结束时间:"+(sdf.format(stop)));//日志
        //总时间
        long time=stop.getTime()-start.getTime();
        logger.info("时间总计:"+time+"ms");//日志
    }
}

在这里插入图片描述

/**service层的aop增强
 */
@Aspect
@Configuration
public class ServiceAop {
    private final static Logger  logger=LoggerFactory.getLogger(ServiceAop.class);
    @Pointcut("execution(public * com.ucare.mall.service.*.*(..))")  //service层所有方法都调用
    public void webLog(){} 
    @Around("webLog()")
    public Object ServiceAopAround(ProceedingJoinPoint pro) throws Throwable {
        //调用方法
        Object object=pro.proceed();//获取方法返回值
        return object;
    }
}

获取请求信息,显示日志

    /**
     * 记录日志信息
     */
    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();//获取请求
        HttpServletRequest request = attributes.getRequest();//url
        logger.info("url={}", request.getRequestURL());//method
        logger.info("method={}", request.getMethod());//获取请求get/post类型//ip
        logger.info("ip={}", request.getRemoteAddr());//获取请求ip//类方法
        logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());//获取方法全路径名//参数
        logger.info("args={}", joinPoint.getArgs());//获取方法参数
    }
//输出
url=http://12Z.0,0,1:8080/girls
method=GET
ip=127.0.0.1
class_method=com.imooc.controller.GirlController.girlList
args={}
//------------------------
url=http://12Z.0,0,1:8080/girls/20
method=GET
ip=127.0.0.1
class_method=com.imooc.controller.GirlController.girlList
args=20

获取返回信息,设置日志

    @AfterReturning(returning = "object", pointcut = "log()")//获取返回的信息
    public void doAfterReturning(Object object) {//返回值
        logger.info("response={}", object.toString());
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值