Aspect Oriented Programming(AOP)从某种意义上说是对OOP的补充,因为它还提供了模块化的功能。但是模块化的关键单元是方面而不是类。
AOP将程序逻辑分为不同的部分(称为关注点)。它用于通过 跨领域关注点来提高模块化。
cross-cutting concerns是一个会影响整个应用程序的关注点,应该尽可能集中在一个位置的代码中,例如事务管理,身份验证,日志记录,安全性等。
为什么使用AOP?
它提供了一种可插拔的方式,可以在实际逻辑之前,之后或周围动态添加附加关注点。假设一个类中有10个方法,如下所示:
class A{ public void m1(){...} public void m2(){...} public void m3(){...} public void m4(){...} public void m5(){...} public void n1(){...} public void n2(){...} public void p1(){...} public void p2(){...} public void p3(){...} }
从m开始有5种方法,从n开始有2种方法,从p开始有3种方法。
了解情况我必须维护日志并发送
没有AOP的问题我们可以从m开头的方法中调用方法(维护日志并发送通知)。在这种情况下,我们需要使用所有5种方法编写代码。
但是,如果客户以后说,我不必发送通知,则需要更改所有方法。这会导致维护问题。
AOP解决方案我们不必从方法中调用方法。现在,我们可以在类的方法中定义其他关注点,例如维护日志,发送通知等。它的条目在xml文件中给出。
将来,如果客户说要删除通知程序功能,我们只需要在xml文件中进行更改。因此,在AOP中维护很容易。
在以下情况下主要使用AOP:
提供声明式企业服务,例如声明式事务管理。 它允许用户实现自定义aspects。
AOP概念和术语如下:
Join point Advice Pointcut Introduction Target Object Aspect Interceptor AOP Proxy Weaving
Join point是程序中的任何点,例如方法执行,异常处理,字段访问等。Spring仅支持方法执行Join point。
Advice表示方面在特定的Join point处采取的操作。有不同类型的Advice:
Before Advice: 它在Join point之前执行。 After Returning Advice: 在联合点正常完成后执行。 After Throwing Advice: 如果方法因引发异常而退出,则执行。 After (finally) Advice: 无论Join point退出是正常返回还是异常返回,它都会在Join point之后执行。 Around Advice: 它在Join point之前和之后执行。
它是AOP的一种表达语言,它与Join point相匹配。
这意味着引入类型的其他方法和字段。它允许您向任何建议对象引入新的界面。
这是一个或多个方面建议的对象。在Spring,它也被称为代理对象,因为Spring AOP是使用运行时代理实现的。
这是一个包含建议,Join point等的类。
这是一个仅包含一个建议的方面。
它用于实现由AOP框架创建的方面合同。在Spring框架中它将是JDK动态代理或CGLIB代理。
这是将方面与其他应用程序类型或对象链接在一起以创建建议对象的过程。编织可以在编译时,加载时或运行时完成。 Spring AOP在运行时执行编织。
AOP实现由以下提供:
AspectJ SpringAOP JBoss AOP
Spring AOP可以通过以下三种方式使用。但是广泛使用的方法是Spring AspectJ注释样式。下面给出了使用Spring AOP的3种方法:
采用Spring1.2旧样式(基于dtd)(在Spring3中也受支持) 通过AspectJ注释样式 通过Spring XML配置样式(基于模式)