AOP笔记

AOP使用场景:
AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在Java EE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP 已经成为一种非常常用的解决方案。
AspectJ通常被称为编译时增强的 AOP 框架,编译时增强的 AOP 框架在性能上更有优势——因为运行时动态增强的AOP框架需要每次运行时都进行动态增强。
使用 Spring AOP与AspectJ相同的是,Spring AOP同样需要对目标类进行增强,也就是生成新的AOP代理类;与AspectJ不同的是,Spring AOP无需使用任何特殊命令对Java源代码进行编译,它采用运行时动态地、在内存中临时生成“代理类”的方式来生成AOP代理。
Spring允许使用AspectJ Annotation用于定义方面(Aspect)、切入点(Pointcut)和增强处理(Advice),Spring 框架则可识别并根据这些Annotation来生成AOP代理。Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的编译器或者织入器(Weaver),底层依然使用的是Spring AOP,依然是在运行时动态生成AOP代理,并不依赖于AspectJ 的编译器或者织入器。
简单地说,Spring依然采用运行时生成动态代理的方式来增强目标对象,所以它不需要增加额外的编译,也不需要AspectJ的织入器支持;而AspectJ在采用编译时增强,所以AspectJ需要使用自己的编译器来编译Java文件,还需要织入器。

Spring AOP框架对 AOP 代理类的处理原则是:
如果目标对象的实现类实现了接口,Spring AOP将会采用JDK动态代理来生成AOP代理类;如果目标对象的实现类没有实现接口,Spring AOP将会采用CGLIB来生成AOP代理类——不过这个选择过程对开发者完全透明、开发者也无需关心。
Spring AOP会动态选择使用JDK动态代理、CGLIB来生成AOP代理,如果目标类实现了接口,Spring AOP则无需CGLIB的支持,直接使用JDK提供的Proxy和InvocationHandler来生成 AOP 代理即可。

AOP广泛应用于处理一些具有横切性质的系统级服务。AOP的出现是对OOP的良好补充,它使得开发者能用更优雅的方式处理具有横切性质的服务。不管是那种AOP实现,不论是AspectJ、还是Spring AOP,它们都需要动态地生成一个AOP代理类,区别只是生成AOP代理类的时机不同:AspectJ采用编译时生成AOP代理类,因此具有更好的性能,但需要使用特定的编译器进行处理;而Spring AOP则采用运行时生成AOP代理类,因此无需使用特定编译器进行处理。由于Spring AOP需要在每次运行时生成AOP代理,因此性能略差一些。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据