前面两篇文章都是说的在代码运行时动态的生成class文件达到动态代理的目的,那我们现在回到静态代理,静态代理唯一的缺点就是我们需要对每一个方法编写我们的代理逻辑,造成了工作的繁琐和复杂。AspectJ就是为了解决这个问题,在编译成class字节码的时候在方法周围加上业务逻辑。复杂的工作由特定的编译器帮我们做。

AOP有切面(Aspect)、连接点(joinpoint)、通知(advice)、切入点(Pointcut)、目标对象(target)等概念,这里不详细介绍这些概念.

AspectJ的使用

如何做ASpectj开发,这里使用的是maven插件:

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.5</version><executions><execution><goals><goal>compile</goal><goal>test-compile</goal></goals></execution></executions><configuration><source>1.6</source><target>1.6</target><encoding>UTF-8</encoding><complianceLevel>1.6</complianceLevel><verbose>true</verbose><showWeaveInfo>true</showWeaveInfo></configuration></plugin>

然后编写Aspectj的文件.可以编写.ajc文件,或者使用java文件也可以:

//表示对实现了Mtrace接口的类,并且参数数Integer 同时方法中有@RequestMapping 注解的方法插入代理@Pointcut("execution(* com.meituan.deploy.Mtrace+.*(java.lang.Integer)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")public void zhiru2() {}@Before(value = "zhiru2()")//前面植入public void doBeforeTask2(JoinPoint point) {//方法调用前植入System.out.println("=========BEFORE=========");}@After("zhiru2()")//后面植入public void after(JoinPoint point) {//方法调用后植入System.out.println("===========AFTER=======");}@AfterThrowing("zhiru2()")public void afterthrowing(JoinPoint point) {System.out.println("===========throwing=======");}@AfterReturning("zhiru2()")public void afterRutuen(JoinPoint point) {System.out.println("===========return=======");}

AspectJ的原理分析

反编译过后得到的java代码如下:

@RequestMapping({"/hello"})public ModelAndView helloMyMethodName(Integer name) throws SQLException {JoinPoint var2 = Factory.makeJP(ajc$tjp_0, this, this, name);Object var7;try {Object var5;try {//调用beforeAspectj.aspectOf().doBeforeTask2(var2);System.out.println(name);Util.report("xiezhaodong");var5 = null;} catch (Throwable var8) {Aspectj.aspectOf().after(var2);throw var8;}//调用afterAspectj.aspectOf().after(var2);var7 = var5;} catch (Throwable var9) {//调用抛出异常Aspectj.aspectOf().afterthrowing(var2);throw var9;}//调用returnAspectj.aspectOf().afterRutuen(var2);return (ModelAndView)var7;}@RequestMapping({"/hello2"})public ModelAndView helloMyMethodName222(String name) throws SQLException {return new ModelAndView("hello", "name", name);
}

上面两个方法都实现了@ RequestMapping注解,类也实现类Mtrace接口。但是因为传入参数的类型不同,所以只有第一个方法被织入了代理的方法,在真正的方法快周围分表调用了beforeafterafterThrowingafterRutnrn等方法。Aspectj简单的原理就是这样.更加深入的原理解析暂时就不做了。

小结

  • Aspectj并不是动态的在运行时生成代理类,而是在编译的时候就植入代码到class文件
  • 由于是静态织入的,所以性能相对来说比较好
  • Aspectj不受类的特殊限制,不管方法是private、或者static、或者final的,都可以代理
  • Aspectj不会代理除了限定方法之外任何其他诸如toString(),clone()等方法

静态代理之AspectJ编译织入相关推荐

  1. aspectj切面织入

    一.介绍 AspectJ 是一个 AOP 的具体实现框架.AOP(Aspect Oriented Programming)即面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给 ...

  2. AspectJ编译器织入与SpringAOP的运行期织入

    Java Builder 编译:运行期织入 需要定义切面类的Bean,不定义则不会织入. public class TrackCounterConfig {@Beanpublic TrackCount ...

  3. AspectJ 静态代理实践

    文章目录 前言 一.AspectJ下载地址 1.[AspectJ官网地址](https://www.eclipse.org/aspectj/downloads.php) 2.进入jar所在目录,输入C ...

  4. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  5. 设计模式-静态代理和动态代理

    一.静态代理模式 在我看来,代理模式就是现实中的各种外包. 例如工厂招聘:前期招工场地确定以及布置 -> 招工宣传 -> 对应聘者的考核 -> 工资的确认 ->工人进厂然而,对 ...

  6. java 动静态代理(https://www.cnblogs.com/V1haoge/p/5860749.html)

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  7. .NET静态代码织入——肉夹馍(Rougamo)

    肉夹馍是什么 肉夹馍通过静态代码织入方式实现AOP的组件..NET常用的AOP有Castle DynamicProxy.AspectCore等,以上两种AOP组件都是通过运行时生成一个代理类执行AOP ...

  8. AOP相关术语(连接点、切入点、通知、引介、目标对象、织入、代理、切面)

    Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.(通俗理解:业务层接口的所有方法都叫连接点) Pointcu ...

  9. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    Java之代理... 1 一.         概念... 1 二.         jdk的静态代理... 1 三.         jdk动态代理... 4 四.         cglib 动态 ...

最新文章

  1. 【leetcode】923. 3Sum With Multiplicity
  2. python运行系统找不到指定文件_“系统无法找到指定的文件”当调用Python中的subprocess.Popen...
  3. 参考灵敏度_和平精英2021灵敏度分享码一览 S11灵敏度压枪目前最稳调整攻略
  4. erlang虚拟机精要(2)-异步信号时间功能
  5. VueJs学习入门指引
  6. Docker容器硬盘热扩容-centos6
  7. Yolov4训练自己的数据集
  8. 多线程启动定时器 会等待上一次执行完成?_Java多线程
  9. 大型企业网络设备管理
  10. nnlm 中的 Softmax
  11. 12306 回应软件崩了;微信发布新版本,朋友圈可“斗图”;Ant Design 3.26.4 发布 | 极客头条...
  12. Java多线程面试题总结,Java岗
  13. 当我们谈论深度学习时,我们在谈论什么?
  14. 小程序 canvas旋转文字
  15. Python自动化测试进阶系列——自动发邮件功能
  16. android 百度浏览器内核,百度推手机浏览器Android版 移植webkit内核
  17. mysql命令创库创表_创库+表的操作
  18. LVM逻辑卷快照的添加,删除逻辑卷!
  19. Android: Invalid VCS root mapping
  20. 多模块,Maven无法下载依赖,仓库查看有这个版本但是无法下载,点reload也没用

热门文章

  1. 个人学习笔记——庄懂的技术美术入门课(美术向)19
  2. 剑指offer:数组
  3. 雅虎高管解读财报 将在今年完成阿里资产剥离
  4. 数字图像基本处理算法
  5. 自然语言处理——词性标注、词干提取、词形还原
  6. 物价压力居高不下 低成本生活抠抠族各显神通
  7. MASM32连接程序时error A2006: undefined symbol : u
  8. 个人第一篇博客——自我介绍
  9. 技术科普丨逆光也清晰-HDR
  10. 智能车竞赛:关于车模系列的价格调整