AspectJ如何实现AOP

SAE J1850协议:从波形解析到汽车诊断实战 本文深入解析SAE J1850协议在汽车诊断中的应用,重点对比其PWM和VPW两种实现方式的波形特征、帧结构及诊断要点。通过实测案例,详细介绍了如何通过波形分析精准定位通用和福特等美系车型的通信故障,提升汽车电子诊断实战能力。 阅读详情

原创文章如转载,请注明:转载自:飞扬部落编程仓库 : http://www.busfly.net/csdn/

 

使用AspectJ,我们不用对原有的代码做任何修改,就可以为代码提供不同的Aspect(方面)--比如,认证,事务等。我们只需要提供两个不同的Aspect--认证Aspect和事务Aspect。

比如,我们有一个Bank(银行)类。Bank有两个方法,deposit(存钱)和withdraw(取钱)。
class Bank {

public float deposit(AccountInfo account, float money){
// 增加account账户的钱数,返回账户里当前的钱数
}
public float withdraw(AccountInfo account, float money){
// 减少account账户的钱数,返回取出的钱数
}
}

这两个方法涉及到用户的账户资金等重要信息,必须要非常小心,所以编写完上面的商业逻辑之后,项目负责人又提出了新的要求--给Bank类的每个重要方法加上安全认证特性。
于是,我们不得不分别在上面的两个方法中加入安全认证的代码。
class Bank {

public float deposit(AccountInfo account, float money){
// 验证account是否为合法用户
// 增加account账户的钱数,返回账户里当前的钱数
}
public float withdraw(AccountInfo account, float money){
// 验证account是否为合法用户
// 减少account账户的钱数,返回取出的钱数
}
}
这两个方法都需要操作数据库,为了保持数据完整性,项目负责人又提出了新的要求--给Bank类的每个操作数据库的方法加上事务控制。
于是,我们不得不分别在上面的两个方法中加入安全认证的代码。
class Bank {

public float deposit(AccountInfo account, float money){
// 验证account是否为合法用户
// Begin Transaction
// 增加account账户的钱数,返回账户里当前的钱数
// End Transaction
}
public float withdraw(AccountInfo account, float money){
// 验证account是否为合法用户
// Begin Transaction
// 减少account账户的钱数,返回取出的钱数
// End Transaction
}
}
我们看到,这些与商业逻辑无关的重复代码遍布在整个程序中。实际的工程项目中涉及到的类和函数,远远不止两个。如何解决这种问题?
我们首先来看看OOP能否解决这个问题。

我们利用Design Pattern的Template Pattern,可以抽出一个框架,改变上面的例子的整个设计结构。
abstract class Base {
public float importantMethod(AccountInfo account, float money){
// 验证account是否为合法用户
// Begin Transaction
float result = yourBusiness(account, money)
// End Transaction
return result; 
}
protected abstract float yourBusiness(AccountInfo account, float money);
}
class BankDeposit extends Base{ 
protected float yourBusiness(AccountInfo account, float money){
// 增加account账户的钱数,返回账户里当前的钱数
}
};
class BankWithdraw extends Base{ 
protected float yourBusiness(AccountInfo account, float money){
// 减少account账户的钱数,返回取出的钱数
}
};
这里我们用一种很勉强的方法实现了认证和事务代码的重用。而且,有心的读者可能会注意到,这种方法的前提是,强制所有的方法都遵守同样的signature。
如果有一个转账方法transfer(AccountInfo giver, AccountInfo receiver, float money),由于transfer方法的signature不同于yourBusiness的signature,这个方法无法使用上面的框架。
这个例子中提到的认证,事务等方面,就是AOP所关心的Aspect。
AOP就是为了解决这种问题而出现的。AOP的目的就是-- Separation of Concerns.

下面介绍AspectJ工具如何解决Separation of Aspects的问题。

我们只需要提供两个不同的Aspect--认证Aspect和事务Aspect。
aspect AuthAspect {

pointcut bankMethods() : execution (* Bank.deposit(…)) || execution (* Bank. withdraw (…));

Object around(): bankMethods(){
// 验证account是否为合法用户
return proceed();
}
}
aspect TransactionAspect {

pointcut bankMethods() : execution(* Bank.deposit(…)) || execution (* Bank. withdraw (…));
Object around(): bankMethods(){
// Begin Transaction
Object result = proceed();
// End Transaction
return result;
}
}

我们用AspectJ编译器编译Bank文件和含有aspect的这个文件,出来的结果就是带有安全认证和事务处理的Bank类。编译出来的这个Bank类调用了AspectJ Runtime Lib,所以,如果你要运行这个Bank类,你需要把AspectJ Runtime Lib设置在你的classpath里面。

我们来看看,AspectJ编译器为我们做了什么事情。

1. 首先,AspectJ从文件列表里取出所有的文件名,然后读取这些文件,进行分析。

2. AspectJ发现一些文件含有aspect的定义,在这个例子里,就是AuthAspect和TransactionAspect的定义;这些aspect就是代码生成规则。

3. AspectJ根据这些aspect代码生成规则,修改添加你的源代码。在这个例子里,就是修改添加Bank文件。

4. AspectJ读取AuthAspect的定义,发现了一个pointcut--bankMethods();这个pointcut的定义是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示所有对Bank类的deposit和withdraw方法的执行点。

5. AspectJ继续读取AuthAspect的定义,发现了一个around(),这在AspectJ中叫做Advice, Advice允许你在某个类的方法的调用之前或调用之后,加入另外的代码。所示代码中的around()的" // 验证account是否为合法用户"部分,就是要加入的代码。这段代码要加在哪里呢?around()后面跟了一个pointcut--bankMethods()。根据这个pointcut,AspectJ会把这段代码加入到Bank.deposit和Bank.withdraw两个方法的执行之前。

6. AspectJ读取TransactionAspect的定义,象第(4)步一样,发现了发现了一个pointcut--bankMethods()。

AspectJ继续读取AuthAspect的定义,发现了一个around()。这次AspectJ把"Begin Transaction"和"End Transaction"两段代码加在Bank.deposit和Bank. withdraw两个方法的执行前后。

sentinel——SLC数据下载、DEM数据下载拼接、精密轨道数据下载方法 Sentinel——SLC数据下载、DEM数据下载、精密轨道数据下载方法 SLC数据下载 网址:https://search.asf.alaska.edu DEM数据下载 1 手动下载 http://srtm.csi.cgiar.org/srtmdata/ 3.在SARscape中使用下载好的DEM 将下载好的DEM放在软件默认下载DEM路径下(默认路径是C:\Users<用户名&g... 阅读详情

相关推荐

DBSCAN聚类算法——机器学习(理论+图解+python代码)

一、前言 二、DBSCAN聚类算法 三、参数选择 四、DBSCAN算法迭代可视化展示 五、常用的评估方法:轮廓系数 六、用Python实现DBSCAN聚类算法 一、前言 去年学聚类算法的R语言的时候,有层次聚类、系统聚类、K-means聚类、K中心聚类,最后呢,被DBSCAN聚类算法迷上了,为什么呢,首先它可以发现任何形状的簇,其次我认为它的理论也是比较简单易懂的。今年在python...

huacha__的博客 20万+

AspectJ对AOP的实现

AspectJ对AOP的实现一、概述       对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。然而,AspectJ 也实现了 AOP 的功能,且其实现方式更为简捷,使用更为方便,而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。二、AspectJ的通知类型AspectJ中常用的通知类...

职业炮灰的博客 4575

WSL2+Ubuntu20.04纯root环境搭建指南:告别权限烦恼的终极方案

本文提供了一份详细的WSL2+Ubuntu20.04纯root环境搭建指南,旨在为本地开发与学习打造一个免去权限干扰、极致流畅的Linux子系统环境。通过启用WSL2、安装Ubuntu 20.04,并执行核心的root用户设置,开发者可以彻底告别频繁的sudo操作,提升在文件操作、容器调试和系统配置等方面的效率。

time3的博客 474

AOP面向切面编程

目录一、AOP概述1. AOP简介2. 如何理解AOP二、AOP编程术语1. 切面(Aspect)2. 连接点(JoinPoint)3. 切入点(Pointcut)4. 目标对象(Target)5. 通知(Advice)三、Aspectj对AOP的实现1. Aspectj的通知类型2. Aspectj的切入点表达式3. Aspectj的开发环境四、AspectJ基于注解的AOP实现1. ...

山丘i 1759

基于STM32F407VET6的智能巡检小车灰度循迹系统优化设计

本文详细介绍了基于STM32F407VET6主控芯片的智能巡检小车灰度循迹系统优化设计。通过将传感器输出从数字量升级为模拟量以获取更丰富的路面信息,并采用PD控制算法结合速度管理策略,有效提升了小车在复杂弯道上的循迹稳定性与适应性。文章分享了硬件电路抗干扰设计、软件滤波及实战调优经验,为嵌入式开发者提供了从“能跑”到“跑得稳”的系统性解决方案。

weixin_28273593的博客 443

kivy--入门(一)(Windows)python

从零开始学习kivy 由于课程需要写一个app,还要写报告,这就很愁人,头秃,脑壳大。 虽然学过Android,但是小编对于Java就像对牛弹琴似的,不能说完全不懂,只能说Java这个语言不太适合我,不学还不行,还是先利用python的kivy编写一个吧。 在各大网站搜索开发app,发现适合写手机app的除了Android还有kivy,所以还是先学习如何使用吧! 文章目录从零开始学习kivy前言一、安装二、添加按钮+标签三、文本输入(TextInput)总结 前言 首先推荐这篇博客kivy的安装和使用

刘念卿的博客 9968

AspectJ实现AOP编程

AspectJ实现AOP编程,模拟判断登录需求,获取参数。

qq_30974087的博客 934

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 241

Spring框架-aspect实现AOP

Spring框架-aspect实现AOP

陆卿之的博客 1758

从DDH到FastANI:原核生物分类黄金标准的进化史与技术对比

本文系统梳理了原核生物分类标准从DDH到FastANI的四次技术革命,详细解析了95%相似度阈值的科学依据及应用场景。通过对比DDH、16S rRNA、ANI和FastANI的技术特点与性能指标,为微生物研究者提供基因组分类的实战指南,并展望第三代测序时代的分类新挑战。

weixin_29275257的博客 412

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

目前从事linux驱动开发,多交流多学习吧 1096

使用aspectj实现aop的基本步骤(前置通知)

ch06-aop-aspectj: 使用aspectj框架实现aop。 使用aop:目的是给已经存在的一些类和方法,增加额外的功能。 前提是不改变原来的类的代码。 使用aspectj实现aop的基本步骤: 1.新建maven项目 2.加入依赖 1)spring依赖 2)aspectj依赖 3)junit单元测试 3.创建目标类:接口和他的实现类。 要做的是给类中的方法增加功能 4.创建切面类:普通类 1)在类的上面加入 @Aspect 2)在类中定义方法, 方法就是切面要.

R的博客 540

【IoT】压力式电子脉搏器设计

智能硬件

产品线负责人 1619

AspectJ 对于 AOP 的实现

介绍了 AspectJ 的相关内容及 spring 引入 AspectJ 后,注解方式和 xml 配置方式的 AOP 实现

iCheetor 876

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring基于AspectJ实现AOP操作

基于AspectJ实现AOP操作准备工作在项目工程里面引入 AOP 相关依赖。学会使用切入点表达式AOP 操作(AspectJ 注解)1、创建类,在类里面定义方法2、创建增强类(编写增强逻辑),在增强类里面,创建方法,让不同方法代表不同通知类型3、进行通知的配置4、配置不同类型的通知相同的切入点抽取有多个增强类多同一个方法进行增强,设置增强类优先级完全使用注解开发代码结构测试代码 Spring 框架一般都是基于 AspectJ 实现 AOP 操作。 需要注意的是:AspectJ 不是 Spring 组成部

『愚』的博客 6517

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[AOP] 2. AOP的两种实现-Spring AOP以及AspectJ

在接触Spring以及种类繁多的Java框架时,很多开发人员(至少包括我)都会觉得注解是个很奇妙的存在,为什么加上了@Transactional之后,方法会在一个事务的上下文中被执行呢?为什么加上了@Cacheable之后,方法的返回值会被记录到缓存中,从而让下次的重复调用能够直接利用缓存的结果呢?随着对AOP的逐渐应用和了解,才明白注解只是一个表象,在幕后Spring AOP/AspectJ做了大

不忘初心,好好沉淀 2万+

Spring初探之基于AspectJ实现AOP

前言 AspectJ是一个java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能。 AspectJ应用到java代码的过程称为织入,对于织入这个概念,可以简单理解为aspect(切面)应用到目标函数(类)的过程。 对于这个过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过...

lks1139230294的博客 318

使用aspectj实现AOP

aspectj是java语言的一个AOP实现,aspectj不一定要在spring中使用,单独也可以用,本文通过一个简单的例子来说明如果通过独立使用aspectj来实现aop,本文不会介绍aop的相关概念,只给出一个简单的例子。 1. 下载安装aspectj https://www.eclipse.org/aspectj/downloads.php 通过上面的网站下载aspectj的jar包,我下...

gitcat的博客 738

AOP的两种实现-Spring AOP以及AspectJ

1. 前言 注解是个很奇妙的存在,为什么加上了@Transactional之后,方法会在一个事务的上下文中被执行呢?为什么加上了@Cacheable之后,方法的返回值会被记录到缓存中,从而让下次的重复调用能够直接利用缓存的结果呢? 随着对AOP的逐渐应用和了解,才明白注解只是一个表象,在幕后Spring AOP/AspectJ做了大量的工作才得以实现这些神奇的功能。 2. 基于代理(...

吹雪的专栏 673

Spring整合AspectJ基于XML实现AOP

文章目录Spring整合AspectJ实现AOP介绍切入点表达式AspectJ 通知类型基于XML整合AspectJ目标类切面类Spring配置前置通知后置通知环绕通知抛出异常最终通知 Spring整合AspectJ实现AOP 前面我们已经学习了Spring AOP。那我们为什么还需要学习AspectJ,因为AspectJ 更为简单,更加方便。但是在我们的开发中我们不太使用Spring自身的对AO...

C. 969

Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?

Spring AOP:基于代理,运行时织入,适合大多数应用场景,简单易用。:编译时或加载时织入,支持更广泛的连接点,功能强大但复杂度较高。选择哪种 AOP 实现方式取决于具体的应用需求和项目复杂度。希望这些信息对你有所帮助!如果你有任何其他问题或需要进一步的解释,请随时提问。

qq_33240556的博客 1121

AOP___基于aspectJ方式实现

AspectJ实现了AOP功能,使用方便,支持注解。Spring中也有AspectJ的方式实现AOP。在Spring中使用AOP开发时,一般使用AspectJ的实现方式 AspectJ的切点表达式: execution(A, B, C, D, E); [权限修饰符 可选] A:方法返回类型 B:包名 C:类名 D:方法名 E:参数名 [异常类型 可选] 包名,类名,方法名要用.隔开,靠近()的...

qq_37432174的博客 356

aspectj实现aop

文章目录前言一、基本步骤二、操作实例1.maven依赖2.切面类实现 前言     aspectJ: 一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。     aspectJ框架实现aop有两种方式:    1.使用xml的配置文件 : 配置全局事务    2.使用注解,我们在项目中要做aop功能,一般都

m0_51647314的博客 394

AOP及AspectJ 实现AOP

AOP 概念 AOP(Aspect Oriented Programming),通常称为面向切面编程。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和...

weixin_45800832的博客 296

AspectJ实现AOP

AOP 是面向切面编程的编程思想,AOP 解决日志、权限等于横切性问题,将这些问题与主业务逻辑分开,达到与主业务逻辑结构的目的。 当我们在编写程序的时候,需要完成一些与核心业务逻辑无关的功能。比如说日志功能、权限校验功能。这些操作与对象的核心功能无关,并且散落在各种业务逻辑之中。我们将日志、权限控制这样的功能抽离成独立的切面,并在程序中设置连接点使用这些功能,这就是 AOP 的思...

深页 170

Spring整合AspectJ基于注解实现AOP

文章目录Spring整合AspectJ基于注解实现AOP替换bean替换AOP声明切面替换前置通知替换公共切入点替换后置替换环绕替换抛出异常AOP注解总结 Spring整合AspectJ基于注解实现AOP 我们把上一篇Spring整合AspectJ基于XML实现AOP进行改造成基于注解实现。 首先是pom文件 <?xml version="1.0" encoding="UTF-8"?>...

C. 1203
上一篇: 编程真难啊
下一篇: 基于@AspectJ配置Spring AOP之一
psyuhen
博客等级 码龄19年 62粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值