java实现自定义注解+aop开发

  1. 先自定义注解
@Documented//注解是否将包含在JavaDoc中

//1.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。
		//@Override, @SuppressWarnings都属于这类注解。
//2.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
//3.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。
//我们自定义的注解通常使用这种方式。
@Retention(RetentionPolicy.RUNTIME)

//注解用于什么地方1.CONSTRUCTOR: 用于描述构造器
//2.FIELD: 成员变量、对象、属性(包括enum实例)3.LOCAL_VARIABLE: 用于描述局部变量
//4.METHOD: 用于描述方法5.PACKAGE: 用于描述包6.PARAMETER: 用于描述参数7.TYPE: 用于描述类、接口(包括注解类型) 或enum声明
@Target(ElementType.METHOD)
public @interface Operation {
	//注解属性
	int moduleType();
	int operateLogType();
}
  1. 实现aop

/**
 * @ClassName :   OperationAspect
 * @Author: yangJie
 * @CreateDate: 2020/9/27 13:59
 */
@ApiModel(value = "操作日志切面")
@AllArgsConstructor
@Component
@Aspect
@Slf4j
public class OperationAspect {

	private final OperateLogService service;
	private final DropDownMapper dropDownMapper;
	//切点
	@Pointcut("@annotation(com.wotao.crm.handler.Operation)")
	public void logPointCut() {}

	@SneakyThrows
	@Around("logPointCut()")
	public Object around(ProceedingJoinPoint point) {
		Object o = point.proceed();
		saveOperation(point);//业务逻辑
		return o;
	}
	
	private void saveOperation(ProceedingJoinPoint joinPoint) {
		OperateLog opLog = new OperateLog();
		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
		Method method = signature.getMethod();
		//获取方法上的注解
		Operation operation = method.getAnnotation(Operation.class);
		if(operation != null) {
			int moduleType = operation.moduleType();
			int operateLogType = operation.operateLogType();
			opLog.setModuleType(moduleType);
			opLog.setOperateLogType(operateLogType);
			LambdaQueryWrapper<DropDown> wrapper = Wrappers.lambdaQuery();
			wrapper.eq(DropDown::getValue, operateLogType)
					.eq(DropDown::getParentValue, moduleType)
					.eq(DropDown::getType, DropConst.OPERATION)
					.select(DropDown::getLabel);
			DropDown dropDown = dropDownMapper.selectOne(wrapper);
			if(dropDown != null) {
				opLog.setOperateContent(dropDown.getLabel());
			}
			opLog.setAssociationId(getAssociationId(joinPoint.getArgs(), moduleType, operateLogType));
			service.save(opLog);
		}
	}

	private String getAssociationId(Object[] args, int moduleType, int operateLogType) {
		if(moduleType == OperateLogConst.MODULE_SYS) {//模块类型 系统设置
			if(operateLogType == OperateLogConst.SYS_EDIT_POWER) {
				RoleVO roleVo = new RoleVO();
				BeanUtils.copyProperties(args[0], roleVo);
				Integer roleId = roleVo.getRoleId();
				if(roleId != null) {
					return roleId.toString();
				}
			}
		}
		return null;
	}
}
  1. 实际应用
//加到接口上面
@Operation(moduleType = moduleType值, operateLogType = operateLogType值)

ok!

你可能感兴趣的:(后端笔记,java,spring,spring,boot)