SPRING AOP整理

AspectJ

一套独立的面向切面编程解决方案
使用的是编译时增强,相比spring AOP使用的是运行时增强性能更优优势

使用举例

SayHelloService.java
---
package com.ywsc.fenfenzhong.aspectj.learn;
public class SayHelloService {
    public void say(){
        System.out.print("Hello  AspectJ");
    }
}

现在需要在say()方法后,通过AspectJ的后置增强来增加日志


LogAspect.java
---
package com.ywsc.fenfenzhong.aspectj.learn;
public aspect LogAspect{
    pointcut logPointcut():execution(void SayHelloService.say());
    after():logPointcut(){
         System.out.println("记录日志 ..."); 
    }
}

使用AspectJ的bin命令编译(ajc.exe可以当作增强版本的javac.exe命令)

> ajc -d . SayHelloService.java LogAspect.java
生成 SayHelloService.class
> java SayHelloService
---
输出:  Hello AspectJ  记录日志

Spring AOP

AspectJ并不是spring的部分,spring仅仅使用了AspectJ的Annotation,虽然使用了Aspect的Annotation,但是并没有使用它的编译器和织入器。使用了Aspect来定义切面,使用Pointcut来定义切入点,使用Advice来定义增强处理

spring用了2种代理技术

  • JDK动态代理 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
  • CGLIB 利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容