Loading... AOP可以应用于日志记录,性能统计,安全控制,事务处理,异常处理。 # AspectJ AspectJ算是最早的AOP实现之一,Spring 中的AOP也与AspectJ进行了很好的集成,Spring自身的AOP API也努力与AspectJ保持一致。 <div class="tip inlineBlock warning"> 不过Spring中的AOP只是使用了类似AspectJ的注解,但是并没有使用AspectJ的编译器或者织入器,底层依然使用的是Spring AOP。 AspectJ采用的是编译时增强,所以AspectJ需要自己的编译器来编译Java文件,还需要织入器;而Spring AOP是在运行时动态生成AOP代理。 </div> # Spring中的AOP Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可以由IoC容器的依赖注入提供。 ## JDK动态代理 Spring推荐面向接口编程,因此业务对象通常都会实现一个或多个接口,此时Spring中的AOP 将采用JDK动态代理,但也可强制使用Cglib。 关于JDK的动态代理过程可以参考下文: [java动态代理实现与原理详细分析][1] ## Cglib 对于在需要代理类而不是代理接口的时候,Spring会使用Cglib代理。 使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码。 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-a0214f1ffd14ccd58b2185663732deb622" aria-expanded="true"><div class="accordion-toggle"><span> Cglib动态代理与JDK动态代理区别</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div id="collapse-a0214f1ffd14ccd58b2185663732deb622" class="panel-body collapse in"> java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而Cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理 </div></div> ### ASM ASM是一个通用的Java字节码操作和分析框架。 它可以用于修改现有类或直接以二进制形式动态生成类。 ASM提供了一些常见的字节码转换和分析算法,可以从中构建自定义复杂转换和代码分析工具。 ASM提供与其他Java字节码框架类似的功能,但专注于性能。 更多介绍参考: [AOP 的利器:ASM 3.0 介绍][2] [ASM][3] ## 对比编译时增强和运行时增强 一般来说,编译时增强的 AOP 框架在性能上更有优势。因为运行时动态增强的 AOP 框架需要每次运行时都进行动态增强。 AspectJ采用编译时增强,会增加class文件数量,增加编译时间,但是运行速度更快,不用像动态代理那样每次在运行的时候都要去生成代理。 # Spring中的AOP运用场景 Spring AOP在bean的生命周期中和事务的处理过程中都有运用。 @> 在目标业务bean创建+初始化过程中spring利用<p style="color:red">动态代理机制</p>对原始的业务bean进行了增强。 ## Spring AOP在Bean的创建过程中的运用 [Spring Aop底层原理详解(利用spring后置处理器实现AOP)][4] [【Spring - AOP】--- AOP核心后置处理器的创建过程][5] ## Spring AOP在事务的管理过程中的运用 [Spring 框架之 AOP 原理深度剖析!][6]中的一节:Spring 框架中如何基于 AOP 实现的事务管理 [1]: https://www.cnblogs.com/gonjan-blog/p/6685611.html [2]: https://www.ibm.com/developerworks/cn/java/j-lo-asm30/ [3]: https://www.jianshu.com/p/a1e6b3abd789 [4]: https://blog.csdn.net/baomw/article/details/84262006 [5]: https://blog.csdn.net/nrsc272420199/article/details/103442291 [6]: https://blog.csdn.net/csdnnews/article/details/103231804 [7]: https://hellocyc.com/usr/uploads/2020/07/2339333207.jpg © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付 0