AspectJ 静态代理实践
文章目录
- 前言
- 一、AspectJ下载地址
- 1.[AspectJ官网地址](https://www.eclipse.org/aspectj/downloads.php)
- 2.进入jar所在目录,输入CMD,执行命令 java -jar ***.jar
- 3.一路next
- 4.安装AspectJ的地址,根据自己来改也可默认,后面配置环境变量要用
- 5.完成安装
- 二、配置环境变量
- 1.配置Path
- 2.配置ClassPath--配置完成
- 三、实践操作
- 1.创建目录testAspectJ---BusinessTest.java
- 2. 创建业务类---BusinessTest2.java
- 3.创建AspectJ文件---BeforeAspect.aj---在执行业务之前执行
- 4.创建运行类
- 5.使用ajc编译使切面代码织入
- 6. 运行带有main方法的.class文件
- 7.创建AspectJ文件---AfterAspect.aj---在执行业务之后执行
- 8. ajc编译织入切面代码到业务类---运行主类
- 8.创建AspectJ文件---AroundAspect.aj---在环绕业务方法(之前---之后)执行
- 9.ajc编译织入切面代码到业务类---运行主类
- 总结
前言
AspectJ 静态代理,就是代理在编译阶段将AspectJ代码织入到Java字节码中,运行时就是增强后的class
提示:以下是本篇文章正文内容,下面案例可供参考
一、AspectJ下载地址
1.AspectJ官网地址
2.进入jar所在目录,输入CMD,执行命令 java -jar ***.jar
3.一路next
4.安装AspectJ的地址,根据自己来改也可默认,后面配置环境变量要用
5.完成安装
二、配置环境变量
1.配置Path
图如下,根据你安装AspectJ的地址找bin目录:
2.配置ClassPath–配置完成
图如下,找到aspectjrt.jar,注意后面要加上分号加点 ;. 否则后面运行class文件时jvm虚拟机只会在这个classPath下找class导致找不到文件而报错,加上分号点后jvm虚拟机在这个classPath中找不到就会去其它位置找:
三、实践操作
1.创建目录testAspectJ—BusinessTest.java
如图所示:
package testAspectJ;public class BusinessTest {//模拟业务方法public void business(){System.out.println("执行businessTest的business()方法");}//模拟业务新增方法public int business2(String name,String age){System.out.println("执行businessTest的business2()方法" + name);return 10;}
}
2. 创建业务类—BusinessTest2.java
package testAspectJ;public class BusinessTest2 {//模拟业务方法public void business(){System.out.println("执行BusinessTest2的business()方法");}
}
3.创建AspectJ文件—BeforeAspect.aj—在执行业务之前执行
如图所示:
package testAspectJ;public aspect BeforeAspect {before():call(* testAspectJ.*.*(..)){System.out.println("我是之前,嘿嘿我插队了");}}
4.创建运行类
package testAspectJ;public class AspectTest {public static void main(String[] args) {BusinessTest businessTest = new BusinessTest();businessTest.business();businessTest.business2("迪加", "3000");BusinessTest2 businessTest2 = new BusinessTest2();businessTest2.business();}
}
5.使用ajc编译使切面代码织入
未编译前:
在testAspectJ目录上运行CMD,在CMD上执行ajc -d . xxx.java xxx.aj 使切面代码在编译阶段织入到业务代码中:
编译后:
6. 运行带有main方法的.class文件
使用 java xxx.class 运行主类需要注意有包要加上包名点,否则会找不到主类,无包则不需要:
7.创建AspectJ文件—AfterAspect.aj—在执行业务之后执行
package testAspectJ;public aspect AfterAspect {after():call(* testAspectJ.*.*(..)){System.out.println("我是之后,嘿嘿我是按顺序排队的");}
}
8. ajc编译织入切面代码到业务类—运行主类
8.创建AspectJ文件—AroundAspect.aj—在环绕业务方法(之前—之后)执行
package testAspectJ;public aspect AroundAspect {Object around():call(* testAspectJ.*.*(..)){System.out.println("我是环绕,嘿嘿我插队了");//回调原先的方法Object result = proceed();System.out.println("我是环绕,嘿嘿我又按顺序排队了");return result;}}
9.ajc编译织入切面代码到业务类—运行主类
需要注意的是,切面环绕的之前执行的代码会在before切面的代码执行之后执行。
总结
这里对文章进行总结:
整个流程下来就是简单的实践了AspectJ静态代理的实现与AspectJ如何将切面代码织入到业务代码中。
AspectJ 静态代理实践相关推荐
- Spring AOP中的静态代理和动态代理的原理和实践
对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...
- 静态代理之AspectJ编译织入
前面两篇文章都是说的在代码运行时动态的生成class文件达到动态代理的目的,那我们现在回到静态代理,静态代理唯一的缺点就是我们需要对每一个方法编写我们的代理逻辑,造成了工作的繁琐和复杂.AspectJ ...
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
Java之代理... 1 一. 概念... 1 二. jdk的静态代理... 1 三. jdk动态代理... 4 四. cglib 动态 ...
- 代理模式:aspectj静态代理和jdk,cglib的动态代理的对比
1.使用jdk的动态代理来增强接口实现类. 原理:使用Proxy类的newProxyInstance方法运行期通过反射动态的生成代理对象 优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性. ...
- 记一次Java动态代理实践
导语:在Java生态中,我们经常直接或者间接的用到动态代理,比如通过动态代理调用远程服务,再比如通过动态代理实现解耦.本文结合京东服务框架JSF,讲述京东使用动态代理进行抽象的一次实践,以达到升级数据 ...
- Java静态代理、动态代理与CGLib代理
java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...
- 创建AOP静态代理(上篇)
前言 AOP的静态代理主要是在虚拟机启动时通过改变目标对象字节码的方式来完成对目标对象的增强,它与动态代理相比具有更高的效率,因为在动态代理调用的过程中,还需要一个动态创建代理类并代理目标对象的步骤, ...
- 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
文章目录 Java的静态代理 静态代理的优缺点 ABAP的静态代理 Spring AOP的动态代理 JDK动态代理的优缺点 CGLIB动态代理的优缺点 ABAP CGLIB的模拟实现 ABAP Pre ...
- Spring系列之静态代理、动态代理、cglib代理与Spring AOP的处理
本章内容 代理的概念及理解 如何实现静态代理 如何实现动态代理 静态代理与动态代理有什么区别与优缺点 JDK动态代理如何实现 cglib动态代理如何实现 JDK动态代理与cglib动态代理的区别 Sp ...
最新文章
- Python3中with用法
- SPOJ 1811 LCS [后缀自动机]
- 手机的秘密--按几个键就知道
- c# 实现 加减乘除
- C#Winform控件随窗体缩放
- feign直接走熔断_【121期】面试官:什么是熔断?什么是服务降级?
- Exception in thread main java.lang.NullPointerException
- matlab table中的文字转string_el-table 滚动条美化
- 多个html页面拼接成一个页面_浏览器渲染页面机制以及如何减少DOM操作
- C++之继承探究(三):继承的方式
- 算法笔记_面试题_10.所有可能的满二叉树
- SaltStack系列(二)之常用模块介绍
- 深度学习:基本概要:监督,无监督,半监督,弱监督,多示例,迁移学习
- CPU框架~ 什么是X86 ?~什么是ARM ? 华为鲲鹏云是什么?
- 《乌合之众》中30句精华
- C#阿里云oss接口上传和下载文件
- 内存耗用:VSS/RSS/PSS/USS
- 【Educoder作业】CC++指针实训
- 计算机可以存储人类记忆吗,神经科学:人类大脑是否100%在工作?人类记忆是否有极限?...
- 【IDEA git commit 导航窗口取消对log类文件的 add 操作】
热门文章
- OPENV接收和发送串口的数据
- 高数第一章(函数)练习题
- 数组索引越界异常 ArrayIndexOutOfBoundsException
- springboot整合mybatis错误 Invalid bound statement (not found): com.yuan.mapper.UserMapper.getUserList
- Chakra-UI——React UI 框架
- 群晖NAS教程(十七)、利用Docker安装网心云容器魔方
- Java开发之ServLet详解
- JS任务机制 - springboot实战电商项目mall4j
- 上位机和下位机的区别
- 手把手教你用artifactory搭建maven私有仓库