应用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)报警(播放一段好听的音乐)
}
}
发表回复