这一章内容比较简单,就是大致的了解一下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
分享到:
相关推荐
在Spring AOP中,这些插入的行为被称为“通知”(Advice),包括前置通知、后置通知、环绕通知等。切点(Pointcut)则是匹配连接点的规则,定义了通知何时生效。 回到我们的机器人例子,假设机器人`Robot`需要在打...
描述中提到是"项目源码笔记",适合"入门级别或者复习用",意味着这份资料可能是作者在学习或实践中逐步积累的,适用于初学者巩固基础知识或者有经验者温故知新。所有内容均为作者亲手编写,保证了资料的原创性和可靠...
对于经验丰富的开发者,它则可以帮助温故知新,快速回忆起Spring的各项技术。 首先,Spring的核心组件包括Spring Core和Spring Beans,它们提供了依赖注入(DI)和面向切面编程(AOP)的基础。依赖注入使得对象之间...
spring cloud + openshift example
5. **Spring Cloud Config配置中心**:Config是SpringCloud提供的分布式配置管理工具,它可以集中管理和推送应用的配置,支持配置的实时更新,方便在分布式环境中管理配置。 6. **Spring Cloud Bus**:Spring Cloud...
常用的spring注解大全,适合新手学习、老手温故知新。读懂spring,平步青云。
C#是一种面向对象的编程语言,是ASP.NET开发的主要语言之一,以其简洁、类型安全和高性能著称。在这个“温故知新ASP.NET 2.0(C#)”的学习资源中,我们将深入探讨ASP.NET 2.0的关键特性和C#的编程技巧。 首先,ASP...
Spring Cloud Config 是一个用于分布式系统配置管理的框架,它允许开发者在远程服务器上集中管理和版本化应用的配置,而不是在每个应用本地存储配置。这种方式在微服务架构中尤其有用,因为多个独立的服务需要共享和...
初中语文文学讨论现当代文学温故知新
本文将深入探讨这些技术,帮助开发者温故知新,理解它们的功能、工作原理以及如何在实际项目中应用。 ### JSP(JavaServer Pages) JSP是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,以实现动态内容...
中信建设温故知新,从 4G 看 5G.pdf
1. 工业机器人行业概述:工业机器人是机械工程中的一种高科技自动化设备,主要应用于汽车制造、电子电器、化学橡胶塑料、金属制品、食品制造等多个行业。根据国际机器人联合会(IFR)的统计数据,2019年全球工业...
种子植物是植物界的一大类群,包括裸子植物和被子植物,它们是地球上最高等的植物类型,具有显著的适应陆地生活的能力。在生物学的学习中,了解种子植物的结构和功能对于理解生物多样性至关重要。 本节课程的重点是...
计算机小数表示是一种在计算机中表示小数的方法,分为定点表示法和浮点表示法两种。定点表示法是指小数点的位置固定不变,而浮点表示法是指小数点的位置可以浮动。浮点表示法可以表示更大的数值范围,但运算复杂性较...
《中信建设温故知新,从 4G 看 5G》这份资料主要探讨了移动通信技术从第四代(4G)到第五代(5G)的演进过程,以及这一演变带来的技术创新和产业影响。4G 和 5G 作为两个重要的通信时代,它们之间的差异和联系构成了...
通信行业:温故知新,从4G看5G-1202-中信建投-12页.pdf
这么基础的东西实在不应该再记录了,不过嘛,温故知新~就先从数据类型开始吧 js六大数据类型:number、string、object、Boolean、null、undefined string: 由单引号或双引号来说明,如”string” number:什么整数...
工业机器人是现代制造业中不可或缺的重要组成部分,其发展水平是衡量一个国家制造业自动化、智能化程度的重要标志。本文档探讨了工业机器人在汽车行业中的应用,并结合美国汽车行业历史上的“2mm工程”,分析了工业...
在准备高考或其他重要考试的过程中,数学复习是一项至关重要的任务。要高效地复习数学,考生需要注意以下五个关键点: 首先,复习应该以课本为基础,遵循教学大纲的要求。这意味着要避免过度学习,选择一套高质量的...