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编程的案例(计 ...
随机推荐
- 牛掰,在IDEA中,你可以安装小傅哥写的插件了!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.承认你优秀很难 很多码农,把路走窄了 捧一个,喷一个,很多码农都不会多一点思路看问题,总是 ...
- SpringBoot集成Log4j2框架
1.说明 本文详细介绍Spring Boot集成Log4j2框架的方法, 基于已经创建好的Spring Boot工程, 由于Spring Boot默认使用的是Logback框架, 需要先排除掉Logb ...
- CSS基础 CSS常见错误排错思路
- WPF 使用 Silk.NET 进行 DirectX 渲染入门
本文告诉大家如何使用 dotnet 基金会新开源的 Silk.NET 库调用 DirectX 进行渲染的方法.此库是对 DirectX 的底层基础封装,用上了 dotnet 和 C# 的各个新特性,相 ...
- elasticsearch之警惕inner hits的性能问题
一.inner hits简介 elasticsearch提供了nested数据类型来处理主子文档的问题,可以解决子文档字段被分裂平铺导致字段之间失去了整体的关联性: elasticsearch提供的i ...
- Appium服务器初始化参数(Capability)
原文:https://blog.csdn.net/lilongsy/article/details/83010101 appium官方说明:https://appium.io/docs/cn/writ ...
- Hadoop 之 高可用不自动切换(ssh密钥无效 Caused by: com.jcraft.jsch.JSchException: invalid privatekey )
案例 在安装hadoop ha之后,验证HDFS高可用时,怎么都不能实现自动切换.查看zkfc日志发现错误信息如下: WARN org.apache.hadoop.ha.SshFenceByTcpPo ...
- 在 CentOS 7 上安装 GitLab
1. 安装和配置必要的依赖库 sudo yum install -y curl policycoreutils-python openssh-server # the commands below w ...
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 了解了 eureka 服务注册与发现 的3大角色 ,会使用RestTem ...
- Clickhouse的MergeTree表引擎存储结构
MergeTree存储的文件结构 一张数据表被分成几个data part,每个data part对应文件系统中的一个目录.通过以下SQL可以查询data parts的信息. select table, ...