初试AspectJ切面编程(AOP)

注解切面实现字段存入数据库自动加解密 首先创建两个注解,一个是写在方法上的注解,表明哪些方法是需要加解密操作的,另一个注解是写在实体类上的字段上(自定义的vo和dto也可以加上注释),表明这个实体类的这个字段需要加解密操作。 1.方法注解 @Documented @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Order(Ordered.HIGHEST_PRECEDENCE) public @interface EnCodeMethod { } 2 阅读详情

AspectJ框架是什么

AspectJ框架是一个用于面向切面编程(AOP)的框架。

它是基于Java语言的扩展,提供了更强大和灵活的AOP功能。AspectJ可以在编译时或者运行时织入代码,以实现横切关注点的功能。它支持更细粒度的切入点表达式,可以在类级别、方法级别甚至字段级别进行切面编程。AspectJ还提供了更多的通知类型,如前置通知、后置通知、异常通知、环绕通知等,使开发人员能够更精确地控制横切逻辑的执行时机。AspectJ可以独立于其他框架使用,但也可以与Spring等框架集成,提供更强大的AOP能力。

和SpringAop有什么区别

AspectJ框架和Spring AOP是两种不同的AOP实现方式。

AspectJ是一个独立的AOP框架,它提供了更强大和灵活的AOP功能。它使用编译时织入(CTW)或者运行时织入(RTW)的方式来实现横切关注点的织入。AspectJ支持更多的切入点表达式,可以在更细粒度的层面上进行切面编程。它还提供了更多的通知类型,如前置通知、后置通知、异常通知、环绕通知等。AspectJ可以独立于Spring框架使用,但也可以与Spring集成。

Spring AOP是Spring框架的一部分,它提供了一种更简化的AOP实现方式。它使用运行时代理(Proxy)的方式来实现横切关注点的织入。Spring AOP的功能相对较为有限,只支持方法级别的切入点表达式,通知类型也相对较少,包括前置通知、后置通知、异常通知。Spring AOP主要用于在Spring应用程序中实现横切关注点的功能。

总的来说,AspectJ提供了更强大和灵活的AOP功能,适用于更复杂的切面编程需求;而Spring AOP则提供了一种更简单和轻量级的AOP实现,适用于简单的切面编程需求,并且与Spring框架集成更紧密。

以实现自定义注解为例,两步学会使用

举例实现一个短时间内【限制接口请求次数】的注解

1.自定义注解

java

复制代码

package com.pth.server.core.http; import java.lang.annotation.*; /** * @author Administrator */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestRate { /** * 用户id * @return */ String userId(); /** * 限制次数 * @return */ int rateCount() default 3; /** * 过期时间 * @return */ int expireTime() default 10; }

2.AOP处理实现

java

复制代码

package com.pth.server.core.http; import
cn.hutool.core.convert.Convert; import com.pth.server.core.constants.RedisConstants; import com.pth.server.core.exception.ServerException; import com.pth.server.core.utils.ParamsUtil; import net.sf.json.JSONObject; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; @Component @Aspect public class RequestRateAspect { @Autowired protected RedisTemplate redisTemplate; @Pointcut("@annotation(
com.pth.server.core.http.RequestRate)") public void rateAspect(){} @Before("rateAspect()") public void beforeRate(JoinPoint joinPoint){ MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); // 获取注解中的参数 用于根据属性名获取属性值 因为某些注解的属性值是字符串 但实则是变量 JSONObject paramsJson = ParamsUtil.getParams(joinPoint); RequestRate requestRate = method.getAnnotation(RequestRate.class); String userId = paramsJson.get(requestRate.userId()).toString(); String key = RedisConstants.REQUEST_RATE + userId; Integer val = Convert.toInt(this.redisTemplate.opsForValue().get(key)); if(val == null){ val = 0; }else if(val >= requestRate.rateCount()){ throw new ServerException("请求频率过高,请稍后再试"); } this.redisTemplate.opsForValue().set(key, Convert.toStr(++val), requestRate.expireTime(), TimeUnit.MINUTES); } @After("rateAspect()") public void afterRate(JoinPoint joinPoint){ } }

使用注解

java

复制代码

@RequestMapping(path = "/test", method = RequestMethod.GET) @RequestRate(userId = "userId") void getImgCode(String userId, HttpServletResponse response) throws IOException { }

注解说明(面向小白)

以上用到的注解是用于定义切面的。在面向切面编程(AOP)中,切面是一种用于横切关注点的模块化方式。

@Aspect 注解用于标识一个类为切面类,它通常与其他注解一起使用。

@Before 注解用于指定在目标方法执行之前执行的通知(advice)。

@After 注解用于指定在目标方法执行之后执行的通知。

@Pointcut 注解用于定义一个切入点,切入点是一个表达式,它定义了哪些方法将被切入。切入点表达式可以使用通配符和逻辑操作符来匹配目标方法。

这些注解一起提供了一种方式,通过在特定的切入点上执行额外的逻辑,从而实现横切关注点的功能,例如日志记录、性能监控等。

结尾

怎么样,是不是很简单,就那几个注解就实现了,我写的文章都很简洁,简单便捷,

深入探析切面编程:解密 AspectJ 与 Spring AOP 的 AOP 魔法 这个表格总结了AspectJ和Spring AOP在不同方面的区别。特性/方面AspectJSpring AOP实现方式独立的切面编程框架,扩展了Java语法Spring框架的一部分,基于动态代理和字节码增强技术功能复杂性提供更高级的切面编程能力,支持复杂的切面逻辑更专注于常见的切面功能,适用于简单的切面逻辑依赖性独立使用,需要AspectJ编译器或插件与Spring框架集成,依赖于Spring框架织入方式支持编译时织入和运行时织入。 阅读详情

相关推荐

触摸延时灯课程设计

Multisim源文件下载: 实验名称:­­­­­­­­­­­­­­­­­­­ 课程设计1:触摸延时灯仿真设计 设计要求: 利用单稳态触发器设计触控延时灯,要求利用触发波形的边沿模拟触控点实现触发,触发后3秒灯亮,灯可以亮的时间可在5-10秒之间可调。 设计思路: 利用集成单稳态触发器CD4098设计简易的触摸延时灯电路。应用CD4098可以实现脉冲延时,原理图如下。4脚未触发信号输入端,可通过比较器对触摸产生的信号进行比较后再产生触发信号,使触发准确度得以提高。...

m0_54240221的博客 1万+

AspectJ框架的解析及应用

运行类->右键单击->Run As->Run.,可以在弹出的Run设置窗口设置该类的各项运行属性,切换到ArgumentsTab页,在VM arguments中通过-javaagent指定Aspect织入器类包。相比于加载时织入和运行时织入,编译时织入在编译阶段就将切面织入到目标类的字节码中,这样在程序运行时就无需再进行切面的织入操作。LTW是一种在类加载时织入切面的方式。与CTW和RTW相比,加载时织入提供了更大的灵活性,并且可以在不修改原始源代码的情况下,将切面逻辑应用到已编译的类中。

weixin_64901910的博客 1098

振动信号相位测量的关键技术解析

本文深入解析了振动信号相位测量的关键技术,强调相位是振动信号的“身份证”,对于动平衡和故障诊断至关重要。文章详细阐述了键相传感器与振动传感器的选型、安装要点,以及时域和频域(FFT)核心算法,并针对现场噪声、转速波动等挑战提供了实战解决方案,帮助工程师实现精准、稳定的相位测量。

vv45678的博客 838

浅谈AspectJ框架

execution(*com.xyz.service.impl.*.*(..))任意的返回值类型,在com.xyz.service.impl包下的任意类的任意方法的任意参数。execution(*com.xyz.service..*.*(..))任意的返回值类型,在com.xyz.service及其子包下的任意类的任意方法的任意参数。System.out.println("目标方法的参数"+Arrays.toString(jp.getArgs()));...

weixin_48826996的博客 479

【从零搭建到实战运行】基于PX4-1.13与XTDrone的FAST-LIVO2 Gazebo仿真全流程解析

本文详细解析了从零开始搭建基于PX4-1.13飞控、XTDrone仿真框架与Gazebo的FAST-LIVO2无人机仿真平台的全流程。内容涵盖环境配置、Livox雷达插件定制、算法部署与参数调试,旨在帮助开发者快速构建完整的激光-惯性-视觉SLAM仿真环境,并解决集成过程中的常见问题。

weixin_29218509的博客 520

要配置西门子G120XA变频器实现**端子启停**和**Modbus RTU(485)频率给定

如有问题,可通过STARTER软件在线诊断Modbus通讯状态。要配置西门子G120AX变频器实现。

微:13763355074 4844

使用AspectJ框架实现AOP编程

当我们在开发应用程序时,通常会将业务逻辑和横切关注点混合在一起。例如,我们可能会在每个方法中添加日志记录、事务管理或安全检查等代码。这样做会导致代码冗余、可读性差、难以维护和测试。

陌然的博客 318

校园网改造实录:手把手教你用华为MA5800 OLT调试全光网(附常用排错命令)

本文详细记录了校园全光网改造中华为MA5800 OLT的部署与调试过程,涵盖设备选型、基础配置、ONU批量部署及高频故障排查。通过实战案例和排错命令,帮助网络工程师快速掌握全光网调试技巧,实现低延迟、高稳定的网络性能。

weixin_42552716的博客 572

ssm:面向切面编程-----AOP理论知识

相关实例:AOP初试身手 1.AOP的一些基本概念 a.切面: 一个单独的类,通常在此类种定义一些辅助功能或系统功能的方法。 b.切点: 主业务类的有些方法只想专注于完成核心业务逻辑,不想混入一些辅助性的功能, 可以把这些方法定义为切点,切点就是确定什么位置放置切面。 c.通知: 切点确定了使用切面的位置,但什么时候应用切面就由通知来确定。 d.织入: 切面和切点都是独立的功能类,通过织入才能让切面切入切点, 所以织入就是一种配置过程,让切面能准确的切入指定的位置。 2.spring配置文件中的配置顺序 a

weixin_45873215的博客 242

肿瘤基因组分析实战:VAF、MAF、CCF这些指标到底怎么算?(附Python代码示例)

本文通过Python代码示例,详细解析了肿瘤基因组分析中VAF、MAF和CCF三大核心指标的计算逻辑与应用。文章从VCF文件解析入手,逐步演示了变异等位基因频率、次等位基因频率及癌细胞分数的计算方法,并探讨了拷贝数变异对结果的影响及克隆结构推断的实战流程,为生物信息分析提供实用指南。

silver的专栏 1005

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

LeeKwen的专栏 2169

Spring框架学习笔记6-AOP编程-AspectJ方式

4 AspectJ框架 4.1AspectJ框架简介 一个基于java的aop框架 在Spring2.0后增加了对AspectJ框架的支持。在Spring框架中建议使用AspectJ框架开发AOP. 4.1.1AspectJ框架中的通知类型 前面四个与spring aop框架相同。 前置通知before 后置通知afterReturning 环绕通知around 异常通知afterThrowing 最终通知after :无论程序发生任何事情,都将执行 4.1.2Spring整合AspectJ框架所依赖的ja

White 928

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 545

AspectJ教程--AOP面向切面编程框架(Android)

AOP的概念很久前就接触过了,不过没有真正写过项目,甚至Demo都没有,今天把这点缺陷补上。 推荐两篇文章(本文部分图片引自这两篇文章): 1. 【翻译】Android中的AOP编程 2. 【深入理解Android之AOP】 1. 本篇文章总览2. 什么是AOP2.1 定义 AOP是Aspect Oriented Program的首字母缩写,译为:面向切面编程。类似的OOP,译

听风-Android进阶 9660

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Springboot之切面编程】注解实现敏感字段加解密

当你的项目如果不允许明文存储敏感数据(例如身份证号、银行卡号,手机号等),那么每次存之前都要先将相关敏感字段数据加密、读取出来都要将相应敏感字段的数据解密,这种方式低效、代码臃肿,容易出错。固本文推荐用Aop切面,通过简单注解即可完成加解密工作。用法大致如下: @Override @EncryptMethod//相应方法加上 @EncryptMethod public Te...

程序员小明1024 1958

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring | Spring AOP (以“AspectJ框架“开发实现AOP功能)

基于XML的声明式AspectJ是指通过XML文件来定义切面切入点及通知。所有的切面、切入点和通知都必须定义在元素内。元素及其子元素如下图所示 :在上图中,Spring配置文件中的元素下可以包含多个元素,一个元素中又可以包含属性和子元素,其子元素包括和。在配置时,这3个子元素必须按照此顺序来定义。在元素下,同样包含了属性和多个子元素通过使用元素及其子元素就可以在XIML文件中配置切面切入点和通知.....

m0_70720417的博客 1426

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Spring】AOP的AspectJ开发

1.纯xml配置文件方式:写一个类,再xml文件中配置bean,和即可2.配置加注解:写一个切面类(加上注解@Aspect @Component @Before等)再配置文件中写: 注解驱动3.纯注解方式在配置类上添加@EnableAspectJAutoProxy()其他不变,注意扫描一定要都扫描到。

m0_62645012的博客 2075

Spring5框架—— AspectJ

AOP基本的操作术语,AspectJ的准备(基于AspectJ实现AOP操作、切入点表达式)、AOP操作(AspectJ注解方式、AspectJ配置文件方式)包括完全注解方式

qq_50233116的博客 684

Spring D5

切面:公共的,通用的,重复的功能称为切面。连接点:就算目标方法,因为在目标方法中要实现目标方法的功能和切面功能。切入点(Pointcut):多个连接点构成切入点,切入点可以是一个目标方法,可以是某个包下的所有类中的所有方法目标对象:操作谁,谁就是目标对象通知(Advice):来指定切入的时机,是在目标方法执行前还是执行后还是出错时,还是环绕目标方法切入切面功能是一个优秀的面向切面的框架,它扩展了Java语言,提供了强大的切面实现。它因为是基于Java语言,所以可做到无缝扩展。...

tcben的博客 135

学习AOP框架:AspectJX

记录一下自己学习配置使用AspectJX的步骤,留备自己查看: 1.新建一个Android项目。(这个就不提了) 2.修改配置gradle文件。 2.1项目build.gradle 即使你没有使用kotlin,这里也要配置上kotlin的版本依赖。(目测是aspectjx做了kotlin的兼容,要是没有会报错) 对应的gradle.properties: dist...

a1050762704的博客 1097

AspectJ框架的使用

AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件1. 切面的执行时间,这个执行时间在规范中叫做Advice(通知,增强 的意思) 1.在aspectj框架中使用注解表示的。也可以使用xml文件中的标签。 1)@Before 2)@AfterReturning 3)@Around 4)@AfterThrowing 5)@After 2.表示切面执行的位置,使用的是切入点表达式。 (1) *:匹配任何

qq_41151938的博客 664

JavaAOP编程:AspectJ框架深度解析与实战

文章系统解析了AspectJ的核心概念、三种织入方式(编译期/类加载期/运行期)及适用场景,详细介绍了注解式切面开发的语法要点,包括@Aspect、@Pointcut等核心注解的使用。同时结合Spring整合实例,展示了AspectJ在企业级应用中的实战价值,并针对常见问题提供了解决方案。AspectJ作为实现"关注点分离"的首选方案,能显著提升代码的可维护性和扩展性。

2401_83675559的博客 1340

切面实现自动填充字段数据

今天在优快云看文章 看到了切面实现自动填充字段,于是自己也写一个切面来实现。

Inoue1595505的博客 852

Spring框架入门:AspectJ 详解

AspectJ是由 Eclipse 基金会维护的一个面向切面编程(AOP)的扩展语言,它为 Java 语言增加了 AOP 特性,通过编译期或类加载期修改字节码来实现横切逻辑的织入。AspectJ 是 AOP 领域的“瑞士军刀”——功能全面、性能卓越。虽然 Spring AOP 满足了大多数企业开发需求,但在面对细粒度监控、高性能要求或复杂织入逻辑时,AspectJ 往往是唯一选择。突破代理限制的能力(拦截字段、构造器);极致性能优化的手段(编译时织入);深入理解 JVM 字节码操作的入口。

小二丶的博客 1032

通过Spring提供的AOP切面编程,实现项目中公共字段的自动填充

本文介绍了通过SpringAOP面向切面编程,实现公共字段自动填充的所有代码细节

freedom2030的博客 913

AspectJ入门(一)

AspectJ是一个面向切面的框架,扩展了Java语言。有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。Spring的AOP底层也是用了这个框架。 AOP可以拦截指定的方法并对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

KEEP CODING 1767
上一篇: 一文搞懂JAVA中的线程池
下一篇: JVM--类加载机制全面大解析
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值