原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11833954.html

Spring AOP/切面编程实例和一些注意事项, 主要是利用注解来实现, 具体的理论这里不多说, 因为实践出真知, 很多技术和方法按道理来说是应该先学习理论的, 但是过深的理论探究只会陷入学术陷阱里面, 有一些理论概念知识之后就可以进行一些实战, 随后在慢慢的理解实战中使用的技术或者说一些注解的功能是什么样的, 再次慢慢结合理论知识来加强巩固自己的理解, 不然我上来直接给你说@Aspect是干嘛用的, @Pointcut是干嘛用的, AOP有几个关键点, 效果也不大好, 这些只说一遍 , 然后看了大概知道有几层东西之后就可以开始实战了, 综合实战经验来记住理论知识! 在我看来是一个技术人员最佳的学习途径.

首先是注解类:

import java.lang.annotation.*;

/**
* TODO
* 操作记录注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface OperateRecord {
/**
* 所属控制器名称
* @return
*/
String controllerName() default "默认值";
/**
* 操作类型(CRUD)
* @return
*/
String operateType() default "默认值";
/**
* 所属模块
* @return
*/
String module() default "默认值";
}

重头戏是下面的注解处理类:

/**
* TODO
* 操作记录处理切面类
*/
@Aspect
@Component
public class OperateRecordAspect { @Resource
private OperateRecordService recordService; /**
* 客户端ip地址
*/
private String clientIp = "";
/**
* 操作类型
*/
private String operateType = "";
/**
* 操作控制器
*/
private String operateController = "";
/**
* 所属模块名称
*/
private String module = "";
/**
* 操作记录切入点, 此处@annotation是注解类
*/
@Pointcut("@annotation(com.xxx.OperateRecord)")
public void logOperateRecordPointCut() { } /**
* 操作记录切入点的后置通知(@After的值就是上面的切入点)
* @param joinPoint 操作记录连接点
*/
@After("logOperateRecordPointCut()")
public void afterPointCut(JoinPoint joinPoint){
try {
/**
* 通过连接点来获取方法信息, 然后获取到注解信息
*/
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
       //joinPoint.getArgs();//获取调用注解的那个方法的参数值, 例如:@注解名 public void hello(String id){} joinPoint.getArgs()可以获取到id的值
Method method = signature.getMethod();
OperateRecord record = method.getAnnotation(OperateRecord.class);
HttpServletRequest REQUEST = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
clientIp = IpUtils.getIp(REQUEST);
operateType = record.operateType();
operateController = record.controllerName();
module = record.controllerName();
/**
* 设置记录实体类信息
*/
OperateRecord recordEntity = new OperateRecord();
recordEntity.setId(UuidUtils.getUUID());
recordEntity.setClientIp(clientIp);
recordEntity.setCreateTime(new Date());
recordEntity.setModule(module);
recordEntity.setOperateController(operateController);
recordEntity.setOperateType(operateType); recordService.addOperateRecord(recordEntity);
} catch (Exception e) {
//有异常不用处理, 直接忽略
System.out.println("此信息仅供提示, 不影响程序运行------操作记录切面添加信息异常处理-------");
}
} /**
* 异常通知:目标方法发生异常的时候执行以下代码
* value="execution(* com.xxxx.impl.*.*(..))" 匹配该包下的所有类的所有方法的执行作为切入点
* @param joinPoint
* @param e
*/
@AfterThrowing(value="execution(* com.xxxx.impl.*.*(..))",throwing="e")
public void afterThorwingMethod(JoinPoint joinPoint, NullPointerException e){
try {
/**
* 通过连接点来获取方法信息, 然后获取到注解信息
*/
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
OperateRecord annotation = method.getAnnotation(OperateRecord.class);
} catch (Exception ex){
//有异常不用管
}
} }

以上的实体类和service以及UuidUtils这里用户自行编写, 不同的业务有不同的处理方式.

最新文章

  1. 消息服务MNS和消息队列ONS产品对比
  2. 【WPF】控件使用-宽度自动适应窗口大小
  3. C# Ini配置文件
  4. JS 学习笔记--3--数据类型
  5. LA 3971 (二分) Assemble
  6. Darwin Streaming Server 简介
  7. Java中String的哈希值计算
  8. ASP.NET中实现Ajax分页
  9. 用golang写的 分解x86 intel boot/recovery工具
  10. Python3 知识库
  11. ORACLE EBS 表空间控制
  12. 【转载】Windows Server 2012服务器删除IIS方法
  13. Kong(V1.0.2) Securing the Admin API
  14. asp.net mvc 实战化项目之三板斧
  15. php 字符串截取,支持中文和其他编码
  16. SpringMVC+SpringJdbc+SQLServer+EasyUI增删改查
  17. Log4j Threshold属性指定输出等级
  18. JS中的函数节流throttle详解和优化
  19. mysql创建存储过程,批量建表分表00到99
  20. day4----函数-闭包-装饰器

热门文章

  1. 编写Java程序,测试包的使用和成员的访问权限
  2. 编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面
  3. linux 设置开机自动启动应用
  4. 初识python 之 爬虫:使用正则表达式爬取“古诗文”网页数据
  5. 三分钟:极速体验JAVA版目标检测(YOLO4)
  6. leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II
  7. zip方式安装MySQL提示找不到 MSVCP120.dll的解决方法
  8. linux下编译支持opencl的opencv for android
  9. 44.Prim算法
  10. gin中自定义http的配置