Java AOP (1) compile time weaving 【Java 切面编程 (1) 编译期织入】
According to wikipedia
aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.
Let's imagine we have serveral modules in a project, each of the them is working well until one day the team decide to dig up more information. The desire to add more logs in the project increases while the effort to change the existing codes is huge, it stops the team from moving on bravely.
Somehow the spread of aop cheers the team. According the story, we just need to add a few classes to change the whole project. For example, one class can add entry log to every mothod. It slightly impact the performance and changes almost nothing of the existing codes. A small modification, an encouraging benefit.
AOP(面向切面编程) 通过隔离切面逻辑来提高模块性
假设我们的项目现在已经有不少模块,它们都很正常的运行着。突然有一天,团队想要从现有项目挖掘出更多的信息。比如,通过全面的方法调用日志来作服务监控。一个一个方法的去添加日志固然可以,然而写起来很枯燥也很花时间,这让队伍有所顾虑。
这时,一条好消息传来。据说有个叫AOP的东西可以通过增加很少量的代码就对整个项目进行修改。举个例子,添加一个的切面类就可以给所有方法加上调用日志。可以说在无需触碰现有代码,也不太影响项目性能的情况下,获得了不小的收益。
There are several ways to enhance the current codes using aop:
1) compile time enhancement
2) post compile enhancement
3) load time enhancement
4) run time enhancement
切面编程有许多方法
1) 编译期代码增强
2) 已有二进制代码增强(比如增强第三方库)
3) jvm类加载期代码增加
4) 运行时代码增强
This chapter will show an example of compile time weaving.
这一节会简单介绍下编译器代码织如的方法
Write a simple service
写一个简单的订阅服务
public class BookingService {
public void book() {
System.out.println("Booked a room");
}
}
A test class
一个切面测试类
public class AspectTest {
public static void main(String[] args) throws Exception {
BookingService bookingService = new BookingService();
bookingService.book();
}
}
An aspect class (it's a special class and may not be recoginzed correctly by IDE)
切面类 (IDE可能无法很好识别这个文件)
package aop.compile;
import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;
public aspect TrialAspect{ before():execution(* aop.compile.BookingService.*(..)){ System.out.println("----------log before method excecution----------"); }}
Now, execute weaving command in terminal and run enhanced main class
现在,用ajc编译代码并运行测试类
ajc -d . *.java
java aop.compile.AspectTest
The terminal displays the result as expected. Every time the booking service is called, an entry log will be recorded.
标记部分便是切面逻辑。每次订阅服务有被调用,就会增加一条调用日志
----------log before method excecution---------- Booked a room
Before weaving, the directory looks this way
代码织入之前,目录结构是这样的

After weaving, we found the enhanced class files
运行完ajc之后,可以看到编译出的class文件

Take a look at the BookingService.class, the marked line on which the enhancement relies is used for log purpose.
点开订阅服务的代码一看,原来切面逻辑(打日志)已经写入了book方法
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package aop.compile;
import aop.compile.TrialAspect;
public class BookingService {
public BookingService() {
}
public void book() {
$a8643223();
System.out.println("Booked a room");
}
}
Till this step, the demo is finished.
至此,演示结束
How to use AspectJ
如何使用AspectJ
1. Download aspectj jar from https://eclipse.org/aspectj/
先从官网下载aspectj jar包
2. Install aspectj
安装
java -jar aspectj-xx.jar
an installation window pops up
安装时会弹出窗口

by default, aspectj will be installed in C: driver
3. Configure path and classpath environment variables.
配置环境变量和类路径
Add C:\aspectj1.8\lib\aspectjrt.jar;C:\aspectj1.8\lib\aspectjtools.jar --> classpath
Add C:\aspectj1.8\bin --> path
4. Check installation
检查安装

Java AOP (1) compile time weaving 【Java 切面编程 (1) 编译期织入】的更多相关文章
- Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】
接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy 动态代理 Befor talking abou ...
- Spring AOP 之编译期织入、装载期织入、运行时织入(转)
https://blog.csdn.net/wenbingoon/article/details/22888619 一 前言 AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP ...
- Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)
三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Progra ...
- 面向切面编程AOP
本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...
- 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)
依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见 ...
- Spring 框架基础(04):AOP切面编程概念,几种实现方式演示
本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...
- AOP——面向切面编程
目录 什么是AOP AOP的作用和优势 作用: 优势: AOP相关术语 AOP的实现方式 使用动态代理的方式 使用XML的方式 使用注解的方式 什么是AOP AOP:全称是Aspect Oriente ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- Spring -- aop(面向切面编程),前置&后置&环绕&抛异常通知,引入通知,自动代理
1.概要 aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理) 切面:实现的交叉功能. 通知:切面的实际实现(通知要做什么,怎么做). 连接点:应用程序执行过程期间,可以插入切面的地点. ...
随机推荐
- 【转】SDWebImage实现分析
该博文来自南峰子的技术博客,文章从下载和缓存俩个大的组件分析到里面一些核心方法的实现,条理清晰,相对于一些一上来就通篇分析实现思路的技术文章, 这篇的讲解思路明确,框架架构也讲的比较清楚.看完这篇再去 ...
- css——样式表分类,选择器
一,样式表分类 (1)内联样式[优先级最高][常用][代码重复使用性最差] (当特殊的样式需要应用到个别元素时,就可以使用内联样式. 使用内联样式的方法是在相关的标签中使用样式属性.样式属性可以包含任 ...
- jQuery获取Select选择的Text和 Value(转,待测试确认)
在自己写的第一个小项目的省市区联动的时候需要用到select,找到这篇文章.实在是觉得太好了,忍不住转过来.待日后测试后再修改整理次文章. 下面是文章原文 jQuery获取Select选择的Text和 ...
- 老李分享:导出xml报告到手机
老李分享:导出xml报告到手机 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...
- 老李推荐:第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey 4
在获得比对设备序列号后,findAttachedDevice就会跟提供的序列号进行比对,如果吻合就返回给调用者” 代码8-6-3 AdbBackend - waitForConnection”了.而A ...
- 性能调优案例分享:jvm crash的原因 1
性能调优案例分享:jvm crash的原因 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...
- Android实现网络多线程断点续传下载
本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...
- git常见操作和常见错误
最近写了个博客demo,在上传至github时,居然报错了,刚开始学习代码上传,免不了遇到一些问题,报错信息如下: fatal: remote origin already exists. (致命错误 ...
- Linux之环境变量
1. 变量的显示与设置 显示变量 echo \(PATH</font></code><br/> 取消变量 <code><font color=&q ...
- 设计模式(三)—代理模式
目录: 一.概述 二.静态代理 三.动态代理 四.静态代理和动态代理的区别 一.概述 代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对 ...