AOP 术语
在我们开始使用 AOP 工作之前,让我们熟悉一下 AOP 概念和术语。这些术语并不特定于 Spring,而是与 AOP 有关的。
Aspect 一个模块具有一组提供横切需求的 APIs。例如,一个日志模块为了记录日志将被 AOP 方面调用。应用程序可以拥有任意数量的方面,这取决于需求。
Join point 在你的应用程序中它代表一个点,你可以在插件 AOP 方面。你也能说,它是在实际的应用程序中,其中一个操作将使用 Spring AOP 框架。
Advice 这是实际行动之前或之后执行的方法。这是在程序执行期间通过 Spring AOP 框架实际被调用的代码。
Pointcut 这是一组一个或多个连接点,通知应该被执行。你可以使用表达式或模式指定切入点正如我们将在 AOP 的例子中看到的。
Introduction 引用允许你添加新方法或属性到现有的类中。
Target object 被一个或者多个方面所通知的对象,这个对象永远是一个被代理对象。也称为被通知对象。
Weaving Weaving 把方面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时,类加载时和运行时完成。
通知的类型
Spring 方面可以使用下面提到的五种通知工作:
前置通知 在一个方法执行之前,执行通知。
后置通知 在一个方法执行之后,不考虑其结果,执行通知。
返回后通知 在一个方法执行之后,只有在方法成功完成时,才能执行通知。
抛出异常后通知 在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知。
环绕通知 在建议方法调用之前和之后,执行通知。
声明一个 aspect
一个 aspect 是使用 元素声明的,支持的 bean 是使用 ref 属性引用的
声明一个切入点
一个切入点有助于确定使用不同建议执行的感兴趣的连接点(即方法)。
声明建议
你可以使用 <aop:{ADVICE NAME}> 元素在一个 中声明五个建议中的任何一个
基于 AOP 的 XML 架构的示例
<aop:config>
<aop:aspect id="logging" ref="logging">
<aop:pointcut id="selectAll" expression="execution(* cn.edu.guet.test.*.*(..))"/>
<aop:before pointcut-ref="selectAll" method="BeforeAdvice"/>
<aop:after pointcut-ref="selectAll" method="AfterAdvice"/>
<aop:after-returning method="AfterReturningAdvice" pointcut-ref="selectAll" returning="retVal"/>
<aop:after-throwing method="AfterThrowAdvice" pointcut-ref="selectAll" throwing="ex"/>
</aop:aspect>
</aop:config>
<bean class="cn.edu.guet.test.Student" id="student">
<property name="age" value="32"/>
<property name="name" value="张三"/>
</bean>
<bean class="cn.edu.guet.config.Logging" id="logging"/>
</beans>
Spring 中基于 AOP 的 @AspectJ
切面类
@Aspect
public class Logging {
@Pointcut("execution(* cn.edu.guet.test.Student.*(..))")
private void selectAll(){}
@Before("selectAll()")
public void BeforeAdvice(){
System.out.println("before.");
}
@After("selectAll()")
public void AfterAdvice(){
System.out.println("after.");
}
@AfterReturning(pointcut = "selectAll()", returning="retVal")
public void AfterReturningAdvice(Object retVal){
System.out.println("afterReturning:" + retVal.toString() );
}
@AfterThrowing(pointcut = "selectAll()", throwing = "ex")
public void AfterThrowAdvice(IllegalArgumentException ex){
System.out.println("throw: " + ex.toString());
}
@Around("selectAll()")
public void dddd(){
System.out.println("around");
}
}