1.引入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency>
2. 定义注解类
//表示该注解使用的位置 TYPE:类,接口 FIELD:属性 METHOD:方法 PARAMETER:参数 @Target({ElementType.METHOD,ElementType.TYPE}) //该注解使用后什么时候生效。源码 SOURCE源码时---编译后后CLASS----运行时RUNTIME 默认是SOURCE 一般使用RUNTIME @Retention(RetentionPolicy.RUNTIME) @Documented //在生成API文档时是否存在该注解 public @interface MyAnnotation { String name(); }
3.定义切面类
@Component @Aspect标记该类为切面类
1.定义切点
@Pointcut("@annotation(com.fourth.annotation.MyAnnotation)")
2.处理 通知类型
@Component//表示该类交于spring容器管理
@Aspect//表示该类为切面类
public class LogAspectj {
/*2.定义切点.
第一个*:表示返回类型,
第二个*:表示所有类
第三个*: 表示所有的方法
..:表示任意参数
@Pointcut("execution(* com.fourth.controller.EmpController.login(..))||execution(* com.fourth.controller.DeptController.list(..))") //execution使用路径方式
public void pointcut(){}*/
@Pointcut("@annotation(com.fourth.annotation.MyAnnotation)")
public void pointcut(){}
@Autowired
private HttpServletRequest request;
@Autowired
private HttpSession session;
@Autowired
private OperLogMapper operLogMapper;
//环绕通知
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint){
//操作日志的对象
OperLog operLog=new OperLog();
//获取业务类型
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取被代理的方法对象
Method method = signature.getMethod();
//获取被代理方法对象上的注解对象
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
//获取注解上name属性的值
String name = annotation.name();
operLog.setBusinesstype(name);
//2.获取被代理的接口方法名
String method1 = joinPoint.getSignature().getName();
operLog.setMethod(method1);
//3.获取请求方式
String method2 = request.getMethod();
operLog.setRequestmethod(method2);
//4.获取操作人的姓名
Emp emp= (Emp) session.getAttribute("userinfo");
operLog.setOpername(emp.getEmpName());
//5.获取请求的地址
String operUrl = request.getRequestURI();
operLog.setOperurl(operUrl);
//6.获取ip地址
String remoteAddr = request.getRemoteAddr();
operLog.setOperip(remoteAddr);
//7. 获取被代理方法的参数
Object[] args = joinPoint.getArgs();
String s = Arrays.toString(args);
operLog.setOperparam(s);
//8.操作时间
operLog.setOpertime(new Date());
try{
Object proceed = joinPoint.proceed();
operLog.setJsonresult(proceed.toString());
//9.设置状态
operLog.setStatus(0);
return proceed;
}catch (Throwable throwable){
//设置状态
operLog.setStatus(1);
throwable.printStackTrace();
}finally {
operLogMapper.insert(operLog);
}
return null;
}
}
4.开启注解驱动
<aop:aspectj-autoproxy/>
标签:String,joinPoint,operLog,获取,aop,注解,日志,annotation From: https://blog.csdn.net/weixin_51635918/article/details/144957891