事务管理 及 AOP

一、事务管理

1.1 事务回顾

事务管理 及 AOP_第1张图片

1.2 Spring事务管理

事务管理 及 AOP_第2张图片

事务管理 及 AOP_第3张图片 事务管理 及 AOP_第4张图片

1.3 事务进阶

1.3.1 rollbackfor

事务管理 及 AOP_第5张图片

1.3.2 propagation

事务管理 及 AOP_第6张图片

事务管理 及 AOP_第7张图片 事务管理 及 AOP_第8张图片

控制台日志过滤插件:

事务管理 及 AOP_第9张图片查看事务管理日志是JdbcTrsactionManager类:

        在控制台找到JdbcTrsactionManager——右击——add highlight——红色——所有事务管理日志信息将红色高亮显示

事务管理 及 AOP_第10张图片

事务管理 及 AOP_第11张图片 

二、AOP基础

2.1 AOP概述

事务管理 及 AOP_第12张图片

事务管理 及 AOP_第13张图片 

2.2 AOP快速入门

事务管理 及 AOP_第14张图片

 事务管理 及 AOP_第15张图片

2.3 AOP核心概念

事务管理 及 AOP_第16张图片 

三、AOP进阶

3.1 通知类型

事务管理 及 AOP_第17张图片

 事务管理 及 AOP_第18张图片

事务管理 及 AOP_第19张图片 切入点表达式的抽取和复用:

事务管理 及 AOP_第20张图片

事务管理 及 AOP_第21张图片 

3.2 通知顺序

事务管理 及 AOP_第22张图片

3.3 切入点表达式

事务管理 及 AOP_第23张图片

3.3.1 execution 

事务管理 及 AOP_第24张图片 事务管理 及 AOP_第25张图片

事务管理 及 AOP_第26张图片 事务管理 及 AOP_第27张图片事务管理 及 AOP_第28张图片

3.3.2 @annotation 

事务管理 及 AOP_第29张图片

事务管理 及 AOP_第30张图片 事务管理 及 AOP_第31张图片

事务管理 及 AOP_第32张图片 

3.4 连接点

事务管理 及 AOP_第33张图片

事务管理 及 AOP_第34张图片 

package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

//切面类
@Slf4j
@Aspect
@Component
public class MyAspect8 {

    @Pointcut("execution(* com.itheima.service.DeptService.*(..))")
    private void pt(){}

    @Before("pt()")
    public void before(JoinPoint joinPoint){
        log.info("MyAspect8 ... before ...");
    }

    @Around("pt()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("MyAspect8 around before ...");

        //1. 获取 目标对象的类名 .
        String className = joinPoint.getTarget().getClass().getName();
        log.info("目标对象的类名:{}", className);

        //2. 获取 目标方法的方法名 .
        String methodName = joinPoint.getSignature().getName();
        log.info("目标方法的方法名: {}",methodName);

        //3. 获取 目标方法运行时传入的参数 .
        Object[] args = joinPoint.getArgs();
        log.info("目标方法运行时传入的参数: {}", Arrays.toString(args));

        //4. 放行 目标方法执行 .
        Object result = joinPoint.proceed();

        //5. 获取 目标方法运行的返回值 .
        log.info("目标方法运行的返回值: {}",result);

        log.info("MyAspect8 around after ...");
        return result;
    }
}

四、AOP案例

事务管理 及 AOP_第35张图片

事务管理 及 AOP_第36张图片 事务管理 及 AOP_第37张图片

 事务管理 及 AOP_第38张图片

 事务管理 及 AOP_第39张图片

事务管理 及 AOP_第40张图片 

LogAspect代码详细: 

package com.itheima.aop;

import com.alibaba.fastjson.JSONObject;
import com.itheima.mapper.OperateLogMapper;
import com.itheima.pojo.OperateLog;
import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;

@Slf4j
@Component
@Aspect //切面类
public class LogAspect {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private OperateLogMapper operateLogMapper;

    @Around("@annotation(com.itheima.anno.Log)")
    public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable {
        //操作人ID - 当前登录员工ID
        //获取请求头中的jwt令牌, 解析令牌
        String jwt = request.getHeader("token");
        Claims claims = JwtUtils.parseJWT(jwt);
        Integer operateUser = (Integer) claims.get("id");

        //操作时间
        LocalDateTime operateTime = LocalDateTime.now();

        //操作类名
        String className = joinPoint.getTarget().getClass().getName();

        //操作方法名
        String methodName = joinPoint.getSignature().getName();

        //操作方法参数
        Object[] args = joinPoint.getArgs();
        String methodParams = Arrays.toString(args);

        long begin = System.currentTimeMillis();
        //调用原始目标方法运行
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();

        //方法返回值
        String returnValue = JSONObject.toJSONString(result);

        //操作耗时
        Long costTime = end - begin;


        //记录操作日志
        OperateLog operateLog = new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);
        operateLogMapper.insert(operateLog);

        log.info("AOP记录操作日志: {}" , operateLog);

        return result;
    }

}

 

你可能感兴趣的:(JavaWeb,数据库,mysql,mybatis,java,开发语言)