`
bolide74
  • 浏览: 83340 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
这一章内容比较简单,就是大致的了解一下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



2
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics