应用 jdk 代理形式 AOP 默认应用的 CGLIB 代理
spring.aop.proxy-target-class=false
<!-- Aop 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Aspect// 注解用于示意或者形容 aop 中的切面类型 用于为指标对象进行性能扩大或控制目标对象的执行
// 由此注解形容的类为 springaop 中的一个切面类型此类型能够定义
// 1 切入点(Pointcut)办法(能够是多个)要进行性能扩大的一些点
// 2 告诉 advice 办法能够是多个封装了扩大性能的一些办法在切入点办法之前货之后要执行的办法
@Slf4j// 打印日志信息
@Component// 是 spring 形容 bean 类的一个注解 用于通知 spring 这个类的实例由 spring 创立
public class SysLogAspect {
// 在业务层 的 imp 小写复制过去
@Pointcut("bean(sysUserServiceImpl)")// 注解哟凝固形容切面中的办法 定义切面中的切入点 定义这个类所有切入办法
// 本注解以 bean 结尾 bean 括号中的内容为一个 spring 治理的某个 bean 对象的名字
//
public void logPointCut() {}// 办法中不写任何内容 只是切入点表达式的一个载体
//aournd 注解外部 value 属性的值 为一个切入点表达式一个援用 这个援用为一个 @pointcut 注解示意的办法的办法名
//ProceedingJoinPoint 类为一个连接点类型,此类型的对象用于封装要执行的指标办法
// 他只能用于 @Around 注解形容的办法参数。@Around("logPointCut()")// 注解以用于形容切面中办法 会被认为是一个盘绕告诉 和型业务 执行之前个之后要执行的一个动作
public Object around(ProceedingJoinPoint jp)// 指标办法
throws Throwable{long t1=System.currentTimeMillis();// 执行工夫
try {Object result=jp.proceed();// 最终可能要执行你的指标办法
long t2=System.currentTimeMillis();// 执行工夫
log.info("指标办法 {} 执行时长 {}",t2-t1);//{} 这个在 log.info 外面代表占位符
return result;
}catch(Throwable e) {log.error("指标办法呈现了点问题具体为:{}",e.getMessage());// 记录日志
throw e;
}
}
}
aop 异样解决监听
@Slf4j
@Aspect
@Component
public class SysExceptionAspect {
/** 此办法能够作为一个异样监控办法 */
@AfterThrowing(pointcut = "bean(*ServiceImpl)",throwing = "ex")
public void handleException(JoinPoint jp,Throwable ex) {
// 通过连接点获取指标对象类型
Class<?> targetClass=jp.getTarget().getClass();
String className=targetClass.getName();
// 通过连接点获取办法签名对象
MethodSignature s=(MethodSignature)jp.getSignature();
String methodName=s.getName();// 获取指标办法名
String targetClassMethod=className+"."+methodName;
log.error("{}'exception msg is {}",targetClassMethod,ex.getMessage());
// 拓展?
//1)将日志写到日志文件
//2)将出现异常的这个信息发送到某个人的邮箱(email), 例如 QQ 邮箱
//3)将出现异常的状况发短信给某人(运维人员)
//4)报警(播放一段好听的音乐)
}
}