SpringAOP/切面编程示例
原创:转载需注明原创地址 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/切面编程示例的更多相关文章
- Spring-AOP切面编程(3)
https://www.jianshu.com/p/be69b874a2a9 目录 1. Web MVC发展史历程2.Spring概要3.Spring-依赖注入概要(IOC)4.属性注入的三种实现方式 ...
- 5-19 SpringAop | 切面编程
Aop面向切面编程 什么是Aop 面向切面的程序设计(Aspect Oriented Programming)又译作剖面导向程序设计 和OOP(Object Oriented Programming) ...
- spring面向切面编程示例(xml配置形式vs@注解形式)
一.xml配置形式 1.在Spring配置文件中增加面向切面配置当调用com.activemq.service.impl.ConsumerServiceImpl接口实现类的任意方法时执行切面类中的方法 ...
- JavaWeb_(Spring框架)SpringAOP面向切面编程
SpringAOP:面向切面编程(面向fifter编程) 通俗易懂术语:所有纵向重复的代码,我们提取成横向的代码 以下文章内容参考知乎:从0带你学习SpringAOP,彻底的理解AOP思想 传送门 1 ...
- SpringAOP 面向切面编程
AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...
- Spring-AOP面向切面编程
AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...
- SpringAOP面向切面编程
Spring中三大核心思想之一AOP(面向切面编程): 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的 ...
- 了解并使用springAOP(面向切面编程)
Aop是干嘛的为什么要使用它 在业务系统中,总有一些散落,渗透到系统的各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也称切面, 我们怎样才不受这些附加要求的干扰,专心于真正 ...
- 面向切面编程AOP
本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...
随机推荐
- Word批量设置表格自动调整
1.说明 通过使用Word的宏功能, 批量设置表格, 根据窗口自动调整表格, 使所有表格的宽度和窗口一样, 而不用一个一个手动调整表格. 宏是一个批量处理程序命令, 正确地运用它可以提高工作效率. 微 ...
- mongodb用户权限管理的CRUD
https://blog.csdn.net/weixin_34332905/article/details/88759759?utm_medium=distribute.pc_relevant.non ...
- centos7 文件属性介绍block+软硬连接介绍
block block用于存放的是数据信息 block默认大小是4k,可以进行调整 比较大的文件,会占用多个block 比较小的文件,剩余空间无法使用,浪费磁盘空间 软硬链接的区别 硬链接:是文件的多 ...
- linux笔记(一)
linux 开源镜像网址:http://mirrors.163.com pwd : 展示当前所在的目录的绝对路径 cd : 切换到某个路径 cd 命令,是 Change Directory 的缩写, ...
- Visaul Studio 2015 MFC控件使用之--按钮(Button)
在MFC开发当中,比较常用的控件之一便是Button控件了,该控件的除了可以通过点击产生的开关量当作开关来使用,还可以设置其颜色变化当作显示灯,按钮控件的使用相对来比较简单. 打开工程解决方案的资源视 ...
- Go语言测试:testing
学习参考来源:https://www.liwenzhou.com/posts/Go/16_test/ go test工具 必须导入包: import "testing" go te ...
- 「Python实用秘技04」为pdf文件批量添加文字水印
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...
- 「数据结构」Link-Cut Tree(LCT)
#1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 ...
- 学习JAVAWEB 第三十六天
今天改了一天的bug 使用eclipse出现的问题:首先lib文件夹的名字是不可以更改的它放在WEB-INF文件夹下,放所有的jar包,使用时一定不要忘了将jar包添加至构建路径tomcat的部署问题 ...
- Elasticsearch(2) 数据搜索
本文介绍如何在Elasticsearch中对数据进行搜索. 1.简述 在Elasticsearch中的搜索中,有两类搜索: queries aggregations 区别在于:query可以进行全文搜 ...