原创:转载需注明原创地址 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这里用户自行编写, 不同的业务有不同的处理方式.

SpringAOP/切面编程示例的更多相关文章

  1. Spring-AOP切面编程(3)

    https://www.jianshu.com/p/be69b874a2a9 目录 1. Web MVC发展史历程2.Spring概要3.Spring-依赖注入概要(IOC)4.属性注入的三种实现方式 ...

  2. 5-19 SpringAop | 切面编程

    Aop面向切面编程 什么是Aop 面向切面的程序设计(Aspect Oriented Programming)又译作剖面导向程序设计 和OOP(Object Oriented Programming) ...

  3. spring面向切面编程示例(xml配置形式vs@注解形式)

    一.xml配置形式 1.在Spring配置文件中增加面向切面配置当调用com.activemq.service.impl.ConsumerServiceImpl接口实现类的任意方法时执行切面类中的方法 ...

  4. JavaWeb_(Spring框架)SpringAOP面向切面编程

    SpringAOP:面向切面编程(面向fifter编程) 通俗易懂术语:所有纵向重复的代码,我们提取成横向的代码 以下文章内容参考知乎:从0带你学习SpringAOP,彻底的理解AOP思想 传送门 1 ...

  5. SpringAOP 面向切面编程

    AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...

  6. Spring-AOP面向切面编程

    AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...

  7. SpringAOP面向切面编程

    Spring中三大核心思想之一AOP(面向切面编程): 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的 ...

  8. 了解并使用springAOP(面向切面编程)

    Aop是干嘛的为什么要使用它 在业务系统中,总有一些散落,渗透到系统的各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也称切面, 我们怎样才不受这些附加要求的干扰,专心于真正 ...

  9. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

随机推荐

  1. 【MySQL作业】DDL 和 DML——美和易思使用 DML 删除表数据应用习题

    点击打开所使用到的数据库>>> 删除客户"刘一鸣". 执行 SQL 代码"delete from customer where cName=' 刘一鸣 ...

  2. [学习笔记] Oracle集合运算、内连接、外连接、伪列

    集合运算 INTERSECT(交集),返回两个查询共有的记录. UNION ALL(并集重复),返回各个查询的所有记录,包括重复记录. UNION(并集不重复),返回各个查询的所有记录,不包括重复记录 ...

  3. html 基础 audio和video的基础使用

    基础标签 文本格式化标签: 标签 说明 <b></b>/<strong></strong> 加粗 <u></u>/<ins ...

  4. 简单通俗讲解 android 内存泄漏

    在柠檬班社区看到老师一篇android 内存泄漏写的通俗易懂,绝对是小白能看懂的! 原文:http://www.lemfix.com/topics/2 平常会听到程序员说"内存泄漏" ...

  5. MYSQL 自定义序列函数

    代码如下: DROP TABLE SEQNUM; -- 创建序列表 CREATE TABLE SEQNUM( ID BIGINT ); -- 插入初识值 insert INTO SEQNUM valu ...

  6. 初识python: 字符编码转换

    指定当前文件编码格式:#-*- coding:utf-8 -*-unicode(万国码): 英文字母 1个字节,中文3个字节python中所有的字符都是unicode编码所有非unicode编码互转都 ...

  7. CentOS7 ab压力测试安装与解释

    https://blog.csdn.net/qq_39399966/article/details/102576949 Step 1 - ab (apache benchmark) 安装 yum -y ...

  8. linux 设置root 密码

    指令意思: sudo -i  是 切换到root权限 ,如果没有密码,则直接可以操作,有密码则会要求输入密码 sudo passwd root  是修改密码指令 ,回车后 提示输入新密码 新密码需要输 ...

  9. Zuul网关 @EnableZuulProxy 和 @EnableZuulServer 的区别

    1. @EnableZuulProxy 2. @EnableZuulServer 3.解释 1)@EnableZuulProxy简单理解为@EnableZuulServer的增强版, 当Zuul与Eu ...

  10. Lucene8.5.x全文检索工具

    本文的资源展示: hotword:是热词的文本,比如不是词语的中文,但是是什么人名或者公司名称的词语,需要分词成一个词语的将需要的加入hotword.dic stopword:无意义的词放入的词典,或 ...