一、为什么需要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程序到此为止!

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

  1. 基于AspectJ的注解方式进行AOP开发

    -------------------siwuxie095                                     基于 AspectJ 的注解方式进行 AOP 开发         ...

  2. Spring框架学习09——基于AspectJ的AOP开发

    1.基于注解开发AspectJ (1)AspectJ注解 基于注解开发AspectJ要比基于XML配置开发AspectJ便捷许多,所以在实际开发中推荐使用注解方式.关于注解的相关内容如下: @Aspe ...

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

    -------------------siwuxie095                                 基于 AspectJ 的 XML 方式进行 AOP 开发         1 ...

  4. Spring -- aop, 用Aspectj进行AOP开发

    1. 概要 添加类库:aspectjrt.jar和aspectjweaver.jar 添加aop schema. 定义xml元素:<aop:aspectj-autoproxy> 编写jav ...

  5. Spring 基于 AspectJ 的 AOP 开发

    Spring 基于 AspectJ 的 AOP 开发 在 Spring 的 aop 代理方式中, AspectJ 才是主流. 1. AspectJ 简介 AspectJ 是一个基于 java 语言的 ...

  6. Spring的AOP开发入门,Spring整合Junit单元测试(基于ASpectJ的XML方式)

    参考自 https://www.cnblogs.com/ltfxy/p/9882430.html 创建web项目,引入jar包 除了基本的6个Spring开发的jar包外,还要引入aop开发相关的四个 ...

  7. Spring的AOP开发(基于AspectJ的XML方式)

    Spring的AOP的简介: AOP思想最早是由AOP联盟组织提出的.Spring是使用这种思想最好的框架 Spring的AOP有自己实现的方式(非常繁琐). Aspect是一个AOP的框架, Spr ...

  8. (spring-第19回【AOP基础篇】)基于AspectJ和Schema的AOP

    基于AspectJ就是基于@AspectJ注解,基于Schema就是全部依靠配置文件.那么首先要了解Java注解. Java注解初探 在JDK5.0中,我们可以自定义标签,并通过Java语言的反射机制 ...

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

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

随机推荐

  1. ASP.NET之自定义异步HTTP处理程序(图文教程)

    前面我们学习了关于关于自定义同步HTTP处理程序,相信大家可能感觉有所成就,但是这种同步的机制只能对付客户访问较少的情况或者数据处理量不大的情况,而今天这篇文章就是解决同步HTTP处理程序的这个致命缺 ...

  2. 使用Struts 2框架、ajax提交中文数据在后台乱码的问题

    通过encodeURI()方法转码 encodeURI(url):

  3. 从一个非开发人员转行silverlight满一年的工作总结(第一次发帖)

    自2013年3月进入公司到现在已整整一年.这一年,让我从一个大学毕业就去参军并且专业还不对口的大学生步入了软件开发这个高门槛行业.说实话,我真的很庆幸,庆幸遇到了两位赏识自己的领导从很多专业对口.能力 ...

  4. Android SDK开发常用工具的使用及其异常处理

    由于以下操作都是命令操作,所以在执行以下操作之前确保环境变量 ANDROID_HOME 指向的是正确的Android SDK的路径: 一.启动Android SDK Manager: android ...

  5. 03JS高级关于为空的变量判断

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. Swift和Objective-C的差异性

    1:Type Swift提供了类型推断,不需要人工的去注释变量的类型信息,编译器会通过变量的值来推断类型.例如,编译器可以自动将该变量设置为字符串: // 自动推断,不显示 var name1 = & ...

  7. 5.7 cm server-agent 会出现无法启动

    异常信息如下: 离线安装cloudera-scm-agent5.7的Unable to create the pidfile问题 在离线安装Cloudera Manager启动agent出现了如下异常 ...

  8. 记一次dedeCMS网站搭建全过程

    Step 1 使用阿里云Windows Server 2012服务器 { 使用远程桌面进行操作,ip admin pwd登录 } Step 2 下载安装phpStudy包 { 下载安装,直接安装到C盘 ...

  9. oracle group by 使用

    SELECT supplier_id, max(evidence_date) AS evidence_date,max(TD_SUPPLIER_EVIDENCE_INFO_ID) AS TD_SUPP ...

  10. 通过js控制html页面不能右键,复制等

    <script type="text/javascript"> //Method one //<![CDATA[ //document.oncontextmenu ...