这一章内容比较简单,就是大致的了解一下Spring的AOP框架里的5种Advice:
1、Interception Around(实现MethodInterceptor接口)
2、Before
3、After Returning
4、Throw
5、Introduction
第一个Interception Around通知我们前面一章已经介绍过了,就是实现了
org.aopalliance.intercept.MethodInterceptor这个接口的GiftBySpring类,它的作用就是用代理模式来代理一个目标实例,然后就可以在这个实例的方法前后嵌入自己想要额外增加的功能,比如get/giveGift功能,它的特点就是全面代理了目标实例。
而第二、第三个Before和After Returning这两种通知就有所区别了。看直译就是“前”、“后”的意思,这就代表了这两种通知分别只在目标实例的方法(也就是JoinPoint)
“执行前”、“执行后”才嵌入执行额外功能。可以这样理解:Before和After Returning两种通知其实就是把Interception Around这种通知拆分成了前后两个部分。
第四种Throw通知,就是在被代理的目标Bean(JoinPoint)抛出异常的时候执行Advice
第五种Introduction通知,就是在JoinPoint执行完毕以后再执行Advice,这种通知经常会与After Returning通知相混淆,等会再详细解释它们的区别
因此这5种通知的区别就在于
何时执行额外增加的功能(也就是Advice)!
5种Advice的实现方法其实大同小异,这里为了跟前一篇的Interception Around类型Advice有所区分,所以就再做一个用Before和After Returning的组合来实现相同的get/give礼物的功能。
为了节约篇幅,这里就省略掉跟前面一章相同的ISpeaker接口和Robot类的代码了。
那么我们接下来就是新建一个Before类型的Advice来实现getGift功能:
package com.iteye.bolide74.action;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class GetGift implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("通过MethodBeforeAdvice接口获取了一个礼物!");
}
}
然后是用After Returning来实现giveGift功能:
package com.iteye.bolide74.action;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class GiveGift implements AfterReturningAdvice {
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("通过AfterReturningAdvice接口赠予了一个礼物!");
}
}
最后呢我们只要在前一篇里创建的config.xml里面修改一下配置内容就完成了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="Robot" class="com.iteye.bolide74.action.Robot">
<property name="name" value="Wall-E" />
</bean>
<!-- 这个是前一篇用Interception Around方式实现的get/give礼物功能,这里可以留着,不用就行了;当然也可以注释掉 -->
<bean id="GiftBySpring" class="com.iteye.bolide74.action.GiftBySpring" />
<!-- 这个是getGift Bean -->
<bean id="GetGift" class="com.iteye.bolide74.action.GetGift" />
<!-- 这个是giveGift Bean -->
<bean id="GiveGift" class="com.iteye.bolide74.action.GiveGift" />
<bean id="GiftProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.iteye.bolide74.impl.ISpeaker</value>
</property>
<property name="target">
<ref bean="Robot" />
</property>
<property name="interceptorNames">
<list>
<!-- 上面的内容都和前一篇一样,区别就在这里的value换成了新的GetGift和GiveGift -->
<value>GetGift</value>
<value>GiveGift</value>
</list>
</property>
</bean>
</beans>
修改完config.xml以后就大功告成了!
应用代码还是直接用的前一篇的那个GiftBySpringTester不用做任何修改,我们直接运行看看输出的结果:
引用
通过MethodBeforeAdvice接口获取了一个礼物!
到达邻居家,对邻居说:你好,我是Wall-E
通过AfterReturningAdvice接口赠予了一个礼物!
看完以上新的get/give礼物功能实现方法,是不是觉得Spring的耦合度确实非常低呢?几乎不用修改太多代码就能换掉老的功能,这也是Spring的优势所在!
由于这一部分的内容还是比较枯燥,所以这一章的就是为了抛砖引玉,大概介绍了一下Spring Adivce的5种类型,而它们详细的功能、实现方式和原理,还是希望各位能举一反三,通过其他途径再去深入、再去了解。
可以说我的《Spring温故知新》系列初衷并不是让读者看完以后就完全掌握了Spring,我还没这种能力。写这一系列的目的,仅仅是为了补充和完善现有的Spring各种教材的内容,着重突出教程中没有或没重点介绍的东西。
因此希望各位在读完这一系列的文章以后,能再多去找一些相关的资料来补充和完善自己的知识,谢谢!
下一章:Spring温故知新(八)静态切入点和CGLIB代理,更智能、更方便!
http://bolide74.iteye.com/blog/1048078
上一章:Spring温故知新(六)AOP面向切面编程 <3>
http://bolide74.iteye.com/blog/1037396