漫谈AOP开发之初探AOP及AspectJ的用法

一、为什么需要AOP技术

AOP 是一个很成熟的技术。

假如项目中有方法A、方法B、方法C……等多个方法,

如果项目需要为方法A、方法B、方法C……这批方法增加具有通用性质的横切处理。

下图可以形象的说明具有通用性质的横切处理的思想:

在以前传统的做法是

1、先定义一个Advice方法,该方法实现这个通用性质的横切处理。
2、打开方法A、方法B、方法C……的源代码修改,使得方法A、方法B、方法C……去调用Advice方法。

客户电话: 为每个方法都增加日志。

客户电话: 为每个方法前都增加权限控制。

客户电话: 为每个方法都加……

….

如果使用AOP,可以做到程序员无需修改方法A、方法B、方法C……,但又可以为方法A、方法B、方法C增加调用Advice方法。

 

面向切面编程(AOP)是作为面向对象编程(OOP)的补充:

AOP框架具有如下两个特征:

1、各步骤之间的良好隔离性。
2、源代码无关性。

二、AOP的功能

保证程序员不修改方法A、方法B、方法C……的前提下,可以为方法A、方法B、方法C……增加通用处理。

AOP的本质:依然要去【修改】方法A、方法B、方法C……

—— 只是这个修改由AOP框架完成,程序员不需要改。

AOP要求去修改,到底怎么去修改方法A、方法B、方法……

AOP的实现方式有两种:

  1. AOP框架在编译阶段,就对目标类进行修改,得到的class文件已经是被修改过的。生成静态的AOP代理类(生成*.class文件已经被改掉了,需要使用特定的编译器)。以AspectJ为代表 —— 静态AOP框架。
  2. AOP框架在运行阶段,动态生成AOP代理(在内存中动态地生成AOP代理类),以实现对目标对象的增强。它不需要特殊的编译器。以Spring AOP为代表。—— 动态AOP框架。

上面两种,哪种性能更好?很明显静态的AOP框架更好。

下面我们进入AspectJ的学习

三、实战AspectJ

AspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想。

1、下载和安装AspectJ

1)运行、下载得到的安装JAR包。

在命令行窗口启动下载得到的jar文件:java -jar aspectj-1.6.10.jar,在弹出的安装界面会先让你选择Java,选择你安装的Java目录      即可。将该软件(绝对绿色)安装到指定目录下(笔者安装在C盘)。

2) 系统还应该将C:\Java\aspectj1.6\bin路径添加到PATH环境变量中,

将C:\Java\aspectj1.6\lib\aspectjrt.jar和aspectjtools.jar添加到 CLASSPATH环境变量中。

成功安装了AspectJ之后,将会在E:\Java\AOP\aspectj1.6路径下(AspectJ的安装路径)看到如下文件结构:

  • bin:该路径下存放了aj、aj5、ajc、ajdoc、ajbrowser等命令,其中ajc命令最常用,它的作用类似于javac,用于对普通Java类进行编译时增强。
  • docs:该路径下存放了AspectJ的使用说明、参考手册、API文档等文档。
  • lib:该路径下的4个JAR文件是AspectJ的核心类库。
  • 相关授权文件。

打开DOS窗口,输入ajc命令,可以看到输出ajc命令的所有信息,即可知安装和环境变量配置成功:

2、使用AspectJ

接下来我们模拟一个普通程序:

UserService:

package com.mybry.aop.service;
public class UserService{
public int addUser(){
System.out.println("模拟添加用户的方法。");
return 20;
}
public void validateLogin(){
System.out.println("验证用户登录。");
}
}

BookServce:

package com.mybry.aop.service;
public class BookService{
public int addBook(String name,int price){
System.out.println("正在添加图书,书名是:"+name+",价格是:"+price);
return 100;
}
}

编译运行结果:

这两个类正好相当于我们的方法A,方法B.....

假如客户现在要求在每个方法前面增加权限检查功能,那么该如何做呢?下面我们就是用AspectJ来实现这个功能。

现在我们在这个模拟程序基础上增加这个AOP功能:

我们先写一个权限检查的Aspectj类:

实例1,AuthAspect:

package com.mybry.aop.aspectj;
public aspect AuthAspect{
// Advice
// execution(* com.mybry.aop.service.*.*(..)执行 任意返回值 改包下的任意类的任意方法形参不限
before():execution(* com.mybry.aop.service.*.*(..)){
// 对原来方法进行修改、增强。
System.out.println("----------模拟执行权限检查----------");
}
}

注意这个类色声明类型:aspect,没错,这是写Aspect必须声明的类型,只有AspectJ编译器可以识别。

再用duni>ajc –d *.java命令编译执行:

太开心了,搞定了!

假如此时客户又要求在每个方法中增加事物处理呢?也好办,下面是事物处理类:

实例1,TxAspect:

package com.mybry.aop.aspectj;
public aspect TxAspect{
//around的意思就是在方法的前面和后面都加
Object around():execution(* com.mybry.aop.service.*.*(..)){
// 对原来方法进行修改、增强。
System.out.println("====模拟开启事务====");
Object rvtVal = proceed();
System.out.println("====模拟结束事务====");
return rvtVal;
}
}

好了,我们再来编译运行它:

OK!我们的Aspect AOP程序到此为止!

时间: 2024-12-07 09:10:26

漫谈AOP开发之初探AOP及AspectJ的用法的相关文章

基于AspectJ的XML方式进行AOP开发

-------------------siwuxie095 基于 AspectJ 的 XML 方式进行 AOP 开发 1.首先导入 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 AOP 和 AspectJ 的 jar 包 其中: aopalliance 下载链接: http://mvnrepository.com/artifact/aopalliance/aopalliance aspectjweaver 下载链接: http://mvnrepos

Spring--基于AspectJ的AOP开发

AspectJ简介 ·AspectJ是一个基于Java语言的AOP框架 ·Spring2.0以后新增了对AspectJ切点表达式支持 ·@AspectJ是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面 ·新版本Spring框架,建议使用AspectJ方式来开发AOP ·使用AspectJ需要导入Spring AOP和 Aspect/相关jar包 -spring-aop-4.2.4.RELEASE.jar -com.springsource.org.aopall

从壹开始前后端分离【 .NET Core2.0 Api + Vue 3.0 + AOP + 分布式】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

代码已上传Github,文末有地址 说接上文,上回说到了<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之八 || API项目整体搭建 6.3 异步泛型+依赖注入初探>,后来的标题中,我把仓储两个字给去掉了,因为好像大家对这个模式很有不同的看法,嗯~可能还是我学艺不精,没有说到其中的好处,现在在学DDD领域驱动设计相关资料,有了好的灵感再给大家分享吧. 到目前为止我们的项目已经有了基本的雏形,后端其实已经可以搭建自己的接口列表了,框架已

整合Spring.net到asp.net网站开发中初探

整合Spring.net到asp.net网站开发中初探 http://www.veryhuo.com 2009-10-21 烈火网 投递稿件 我有话说 Spring提供了一个轻量级的用于构建企业级的应用程序的解决方案.Spring提供一致并清晰的配置并整合AOP(Aspect-Oriented Programming)至你的软件中.Spring.net最耀眼的功能是在中间层提供声明式事务管理用于构建全功能的ASP.NET框架. Spring.net是一个提供综合的基础结构用于支持企业级.Net开

spring相关—AOP编程—数学计算器情景示例讲解(包含注解配置AOP与XML配置AOP)

1.数学计算器 ①数学计算器接口[MathCalculator]            public void add(int i,int j);     public int sub(int i,int j);     public int multi(int i,int j);     public void divide(int i,int j);    ②提供简单实现:加减乘除运算[EasyImpl]    ③在简单实现的基础上让每一个计算方法都能够打印日志[LoginImpl]    

开涛spring3(6.1) - AOP 之 6.1 AOP基础

6.1.1  AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢? 传统解决方: 1)日志部分提前公共类LogUtils,定义“longPayBegin”方法用于记录支付开始日志,“logPayEnd”用于记录支付结果: 2)支付部分,定义IPayService接口并定义支付方法“pay”,并定义了两个实现:“PointPayS

开涛spring3(6.2) - AOP 之 6.2 AOP的HelloWorld

6.2.1  准备环境 首先准备开发需要的jar包   org.springframework.aop-3.0.5.RELEASE.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.net.sf.cglib-2.2.0.jar 目前,项目里包是 6.2.2  定义目标类 1)定义目标接口: package lqy

spring aop 基于schema的aop

AOP的基本概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP中表示为"在哪里干": 切入点(Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法,在AOP中表示为"在哪里干的集合":(选取我们所需要的连接点的集

AOP基础知识及AOP切面编程之注释方法、xml配置方法

<span style="font-family: 微软雅黑; font-size: 10.5pt; letter-spacing: 0pt; ">AOP概念</span> Aspect(切面):它跟类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是对横切性关注点的抽象 joinpoint(连接点):所谓连接点就是被拦截到的点,在spring中,这些点是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器