Spring AOP&AspectJ
AOP是什么?
知道概念的可以跳过这一节。
旨在将横切关注点
与业务主体进行进一步分离,以提高程序代码的模块化程度。通过在现有代码基础上增加额外的通知(Advice)机制,能够对被声明为**切点(Pointcut)*的代码块进行统一管理与装饰,如“对所有方法名以‘set’开头的方法添加后台日志”。该思想使得开发人员能够将与代码核心业务逻辑关系不那么密切的功能(如日志功能)添加至程序中,同时又不降低业务代码的可读性。面向切面的程序设计思想也是面向切面软件开发的基础。
面向切面的程序设计将代码逻辑切分为不同的模块(即关注(Concern),一段特定的逻辑功能)。几乎所有的编程思想都涉及代码功能的分类,将各个关注点封装成独立的抽象模块(如函数、过程、模块、类以及方法等),后者又可供进一步实现、封装和重写。部分关注点“横切”程序代码中的数个模块,即在多个模块中都有出现,它们即被称作横切关注(Cross-cutting concerns, Horizontal concerns)”>。
日志功能即是横切关注点的一个典型案例,因为日志功能往往横跨系统中的每个业务模块,即“横切”所有有日志需求的类及方法体。而对于一个信用卡应用程序来说,存款、取款、帐单管理是它的核心关注点,日志和持久化将成为横切整个对象结构的横切关注点。
AOP 概念
知道概念的可以跳过这一节。
-
Join point:连接点 在程序执行期间的一个点,一般是指你要观察的方法。
-
Advice:通知 在JoinPoint处所要采取的操作
-
Pointcut:切入点 Advice和切入点表达式关联,然后在AOP中就可以用来代替JoinPoint
-
Introduction: 引入 代表一个类型声明额外的方法或字段。
-
Target object:一个或多个方面建议的对象。也称为“建议对象”。由于springaop是通过使用运行时代理来实现的,所以这个对象始终是一个代理对象。
-
Weaving: 织入 将方面与其他应用程序类型或对象链接以创建建议的对象。这可以在编译时(例如使用AspectJ编译器)、加载时或运行时完成。springaop和其他纯javaaop框架一样,在运行时执行编织。
-
AOP proxy:AOP框架为实现方面契约(advice方法执行等)而创建的对象。在Spring框架中,AOP代理是JDK动态代理或CGLIB代理。
Advice 注解
- @Before前置通知:advice在joinpoint之前运行,但是不能阻止执行jointpoint,除非抛出了ex
- @After后置通知:不管joinpoint是否正常结束,advice都会被执行。
- @AfterReturning返回通知:在jointpoint完全正常执行后运行
- @AfterThrowing异常通知:如果方法出现ex,advice就会被执行
- @Around环绕通知:环绕在方法的前后调用。可以支持在方法调用的前后做自定义的操作。还负责是继续返回自己的值还是引发ex
Spring AOP
Spring AOP可以认为是spring框架中解决了部分问题的优秀框架,但是还是有些情况下不能支持。
Spring AOP主要目的是实现AOP和SpringIOC的集成,用来解决一些应用的常见问题。
因此,例如,Spring框架的AOP功能通常与SpringIOC容器一起使用。方面是使用普通的bean定义语法配置的(尽管这允许强大的“自动代理”功能)。这是与其他AOP实现的关键区别。使用SpringAOP,您无法轻松或高效地完成某些事情,例如advice非常细粒度的对象(通常是域对象)。在这种情况下,AspectJ是最好的选择。然而,SpringAOP为企业Java应用程序中的大多数问题提供了一个很好的解决方案。
Aop 代理
Spring AOP默认是用标准JDK动态代理,这样可以代理任何接口。但是如果没有接口,就只能使用CGLIB代理,但是对于final是不能代理的,就只能用AspectJ
当然功能更为强大的要数AspectJ组件。
一般来说spring下都是使用JDK 动态代理,如果强制使用CGLIB,就要在配置文件中加入
<aop:config proxy-target-class="true">
<!-- other beans defined here... -->
</aop:config>