使用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)报警(播放一段难听的音乐)
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。