AOP(Aspect Oriented Programming),是面向切面编程的技术。AOP基于IoC基础,是对OOP的有益补充。正则表达式
AOP之因此能获得普遍承认,主要是由于它将应用系统拆分分了2个部分:核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的切面Crosscutting enterprise concerns。例如,全部大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、权限管理(Privilege Management)、日志管理(Logging)和调试管理(Debugging)等。使用AOP技术,可让开发人员只专一核心业务,而通用逻辑则使用AOP技术进行横向切入,由专人去处理这些通用逻辑,会使得任务简单明了,提升开发和调试的效率。spring
要想了解AOP,首先得了解几个重要的基本概念:编程
切面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。好比说事务管理就是J2EE应用中一个很好的横切关注点例子。切面用Spring的Advisor或拦截器实现。
框架
链接点(Joinpoint):程序执行过程当中明确的点,如方法的调用或特定的异常被抛出。
模块化
通知(Advice):在特定的链接点,AOP框架执行的动做。各类类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器作通知模型,维护一个“围绕”链接点的拦截器链。
spa
切入点(Pointcut):指定一个通知将被引起的一系列链接点的集合。AOP框架必须容许开发者指定切入点,例如,使用正则表达式。代理
目标对象(Target Object):包含链接点的对象,也被称做被通知或被代理对象。
调试
AOP代理(AOP Proxy):AOP框架建立的对象,包含通知。在Spring中,AOP代理能够是JDK动态代理或CGLIB代理。日志
编织(Weaving):组装方面来建立一个被通知对象。这能够在编译时完成(例如使用AspectJ编译器),也能够在运行时完成。Spring和其余纯Java AOP框架同样,在运行时完成织入。orm
为了符合各类流程处理,通知类型提供了5种,能够对目标方法进行全方位处理:
Before advice:在某链接点(JoinPoint)以前执行的通知,但这个通知不能阻止链接点前的执行。
ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。
After advice:当某链接点退出的时候执行的通知(不管是正常返回仍是异常退出)。
ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。
After returnadvice:在某链接点正常完成后执行的通知,不包括抛出异常的状况。
ApplicationContext中在<aop:aspect>里面使用<aop:after-returning>元素进行声明。
Around advice:包围一个链接点的通知,相似Web中Servlet规范中的Filter的doFilter方法。能够在方法的调用先后完成自定义的行为,也能够选择不执行。
ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。
Afterthrowing advice:在方法抛出异常退出时执行的通知。
ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。
(经博友提醒,将上图改为此图,是否是比上图印象更深入一下,这两张图算一幅图)
AOP支持2种代理,Jdk的动态代理和CGLIB实现机制。两者有什么区别呢:
Jdk基于接口实现:JDK动态代理对实现了接口的类进行代理。
CGLIB基于继承:CGLIB代理能够对类代理,主要对指定的类生成一个子类,由于是继承,因此目标类最好不要使用final声明。
一般状况下,鼓励使用jdk代理,由于业务通常都会抽象出一个接口,并且不用引入新的东西。若是是遗留的系统,之前没有实现接口,那么只能使用CGLIB。
下篇博文,会实践一下spring aop,敬请期待。