Spring温故知新(七)Advice通知的5种类型

这一章内容比较简单,就是大致的了解一下Spring的AOP框架里的5种Advice:
1、Interception Around(实现MethodInterceptor接口)
2、Before
3、After Returning
4、Throw
5、Introduction

第一个Interception Around通知我们前面一章已经介绍过了,就是实现了[color=blue]org.aopalliance.intercept.MethodInterceptor[/color]这个接口的GiftBySpring类,它的作用就是用代理模式来代理一个目标实例,然后就可以在这个实例的方法前后嵌入自己想要额外增加的功能,比如get/giveGift功能,它的特点就是全面代理了目标实例。


而第二、第三个Before和After Returning这两种通知就有所区别了。看直译就是“前”、“后”的意思,这就代表了这两种通知分别只在目标实例的方法(也就是JoinPoint)[color=red]“执行前”、“执行后”[/color]才嵌入执行额外功能。可以这样理解:Before和After Returning两种通知其实就是把Interception Around这种通知拆分成了前后两个部分。

第四种Throw通知,就是在被代理的目标Bean(JoinPoint)抛出异常的时候执行Advice
第五种Introduction通知,就是在JoinPoint执行完毕以后再执行Advice,这种通知经常会与After Returning通知相混淆,等会再详细解释它们的区别

因此这5种通知的区别就在于[b][color=red]何时[/color][/b]执行额外增加的功能(也就是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不用做任何修改,我们直接运行看看输出的结果:
[quote]通过MethodBeforeAdvice接口获取了一个礼物!
到达邻居家,对邻居说:你好,我是Wall-E
通过AfterReturningAdvice接口赠予了一个礼物![/quote]


看完以上新的get/give礼物功能实现方法,是不是觉得Spring的耦合度确实非常低呢?几乎不用修改太多代码就能换掉老的功能,这也是Spring的优势所在!


由于这一部分的内容还是比较枯燥,所以这一章的就是为了抛砖引玉,大概介绍了一下Spring Adivce的5种类型,而它们详细的功能、实现方式和原理,还是希望各位能举一反三,通过其他途径再去深入、再去了解。

可以说我的《Spring温故知新》系列初衷并不是让读者看完以后就完全掌握了Spring,我还没这种能力。写这一系列的目的,仅仅是为了补充和完善现有的Spring各种教材的内容,着重突出教程中没有或没重点介绍的东西。
因此希望各位在读完这一系列的文章以后,能再多去找一些相关的资料来补充和完善自己的知识,谢谢!


下一章:Spring温故知新(八)静态切入点和CGLIB代理,更智能、更方便![url]http://bolide74.iteye.com/blog/1048078[/url]
上一章:Spring温故知新(六)AOP面向切面编程 <3> [url]http://bolide74.iteye.com/blog/1037396[/url]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值