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编程的案例(计 ...
随机推荐
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- Eclipse设置代码格式化使用空格代替TAB
Java格式设置 打开Window-Preferences,找到Java-Code Style-Formatter,点击图片中的New.. 给配置起一个名字后,修改配置,找到 Indentation, ...
- ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列
接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列 这里继续说下.net core集成使用ActiveMQ.因为代码比较多,所以放到gitee上:https://gitee ...
- winform 自定义自动完成控件
做过前端的朋友肯定很清楚自动完成控件,很多优秀的前端框架都会带有自动完成控件,同样的,winform也有,在我们的TextBox和ComboBox中,只需要设置AutoCompleteSource属性 ...
- Sentry 企业级数据安全解决方案 - Relay 运行模式
内容整理自官方开发文档 Relay 可以在几种主要模式之一下运行,如果您正在配置 Relay server 而不是使用默认设置,那么事先了解这些模式至关重要. 模式存储在配置文件中,该文件包含 rel ...
- Linux下如何部署FTP服务器
FTP 是 File Transfer Protocol 的缩写,即文件传输协议,它通过网络在服务器和客户端之间传输文件,现在已经成为一种广泛使用的标准工具 vsftpd 是 very secure ...
- Python 使用timeit模块计算时间复杂度时系统报“invalid syntax”错误
最近在看算法相关的文档 在时间复杂度环节 遇到一个实例: 导入timeit模块后,通过Timer定时器计算两种不同处理方法的时间复杂度 错误代码及报错如下图所示: 仔细查阅 发现from__main_ ...
- Selenium_使用switch_to.frame处理网页框架切换(13)
与在新窗口打开一个网页后需要切换窗口才能定位元素一样,在iframe标签中的元素也不能直接定位,需要切换到对应的iframe框架中才能进行元素定位. 完成网页框架切换操作需要用selenium中的两个 ...
- captcha_生成图片验证码并返回给前端展示
使用pip install captcha 安装模块 import random import string import os import io from captcha.image import ...
- alias 中使用 awk
alias hehistory10='history |awk "{print \$2}"|sort|uniq -c|sort -rn|head -10' alias lv='ls ...