Spring的Advices
Advices实现了Aspect的真正逻辑。由于织入至Targets的实际不同,spring提供了不同的Advices,像Before Advice,After Advice,Around Advice,Throw Advice。
(1)、Before Advice
通过实现MethodBeforeAdvice来定义
(2)、After Advice
通过实现AfterReturningAdvice来定义
(3)、Around Advice
通过实现MethodInterceptor来定义
(4)、Throw Advice
通过实现ThrowsAdvice来定义

我们将使用一个代理的bean aaa,给这个代理的bean加上我们spring的advice,看看他的日志输出表现。我们通过代码示例来说明:

1、定义基本的advice Bean以及要被调用的类

(1)、beforeAdvice的Bean

package com.itcast.advice; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; /** * 调用方法之前 * */ public class LogBeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("beforeAdvice 调用方法之前被执行!..........."); } }

(2)、afterAdvice的bean

package com.itcast.advice; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; public class LogAfterAdvice implements AfterReturningAdvice { public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("afterAdvice 调用方法之后被执行!..........."); } }

(3)、Around advice的Bean

package com.itcast.advice; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * 环绕通知 * */ public class LogAroundAdvice implements MethodInterceptor { public Object invoke(MethodInvocation mi) throws Throwable { Object result=null; System.out.println("around 调用方法之前...."); result=mi.proceed(); System.out.println("around 调用方法之后..."); return result; } }

(4)、Throw Advice的Bean

package com.itcast.advice; import java.lang.reflect.Method; import org.springframework.aop.ThrowsAdvice; /**抛出异常时候的通知*/ public class ThrowAdvice implements ThrowsAdvice { public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass) { System.out.println("ThrowAdvice 记录异常..........."); } }

(5)、要被代理的类

package com.itcast.proxy; public class HelloSpeaker1 implements IHello { public void hi() { System.out.println("我在HelloSpeaker1中"); } public void hiAAA(String aaa) { System.out.println("我在HelloSpeaker1中---hiAAA["+aaa+"]"); } public void hiBBB(String bbb) throws Exception { System.out.println("我在HelloSpeaker1中---hiBBB["+bbb+"]"); throw new Exception("aaa"); } } package com.itcast.proxy; /** * 代理接口 * */ public interface IHello { public void hi(); public void hiAAA(String aaa); public void hiBBB(String bbb) throws Exception; }

2、在配置文件中声明我们的bean

<!-- 代理 --> <bean id="helloSpeaker1" class="com.itcast.proxy.HelloSpeaker1"></bean> <!-- 声明四种通知类型,其实就是你想加入到其他被代理程序执行逻辑中的代码 --> <bean id="beforeAdvice" class="com.itcast.advice.LogBeforeAdvice"/> <bean id="afterAdvice" class="com.itcast.advice.LogAfterAdvice"></bean> <bean id="aroundAdvice" class="com.itcast.advice.LogAroundAdvice"></bean> <bean id="throwAdvice" class="com.itcast.advice.ThrowAdvice"></bean> <!-- 基础的通知使用,这里强行给helloSpeaker1加上了advice通知 --> <bean id="aaa" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="helloSpeaker1"></property> <property name="interceptorNames"> <list> <value>aroundAdvice</value> <value>beforeAdvice</value> <value>afterAdvice</value> <value>throwAdvice</value> </list> </property> </bean>

3、在main函数中调用

package com.itcast.advice; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.itcast.proxy.IHello; public class AdviceMain { /**对于给基本的spring bean强行指定一批advice方法的调用展示**/ public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-config.xml"); IHello h = (IHello)ctx.getBean("aaa"); h.hiAAA("测试配置aop的adivce"); System.out.println("进行抛出异常的adivce展示-=================="); try { h.hiBBB("测试抛出异常的advice"); } catch (Exception e) { } } }

4、控制台的显示

around 调用方法之前.... beforeAdvice 调用方法之前被执行!........... 我在HelloSpeaker1中---hiAAA[测试配置aop的adivce] afterAdvice 调用方法之后被执行!........... around 调用方法之后... 进行抛出异常的adivce展示-================== 15:05:05,671 DEBUG ThrowsAdviceInterceptor:88 - Found exception handler method: public void com.itcast.advice.ThrowAdvice.afterThrowing(java.lang.reflect.Method,java.lang.Object[],java.lang.Object,java.lang.Throwable) around 调用方法之前.... beforeAdvice 调用方法之前被执行!........... 我在HelloSpeaker1中---hiBBB[测试抛出异常的advice] 15:05:05,687 DEBUG ThrowsAdviceInterceptor:119 - Found handler for exception of type [java.lang.Throwable]: public void com.itcast.advice.ThrowAdvice.afterThrowing(java.lang.reflect.Method,java.lang.Object[],java.lang.Object,java.lang.Throwable) ThrowAdvice 记录异常...........

上边的日志已经说明了,我们给一个bean定义一个代理的bean,然后指定他的拦截器序列,就能在bean中的方法调用的前后,以及抛出异常后进行一系列我们自己定义的操作。

springframework(九)AOP的advices,中规中矩的使用方式相关推荐

  1. 打破“中规中矩”,手机QQ何以萌翻众人?

    随着移动互联网的迅猛发展,越来越多的手机应用展现在了用户面前,不过,面对林林总总的手机应用,有时候我们却提不起兴趣,因为功能的同质化,UI的千篇一律已经让我们多少有些审美疲劳的感觉. 不过,最近手机Q ...

  2. PTA练习7-2 求最大值及其下标 (20 分)-中规中矩

    综述: 本题总体中规中矩,只有一个问题,就是打印第一个最大数的下标,当输入一串数字的时候可能最大的那个数字不止一个,那么当我们找到第一个最大数的时候就可以打印最大数以及下标了. 题目: 本题要求编写程 ...

  3. OPPO A35上手简评:一款中规中矩的入门级智能手机

    5G时代的到来,5G手机成为主流已是大势所趋,但这也并不是说4G手机已经"销声匿迹"了.根据电商平台的销量数据显示,4G手机依旧畅销.换句话说,即便5G手机流行,4G手机的购买价值 ...

  4. 名人热议新iPhone:5S中规中矩5C莫名其妙

    在微博上,iPhone 5s与5c的外观.性能以及缺乏竞争力的价格,都成为了名人们的吐槽点. iPhone 5s与5c在万众瞩目下揭开了并不神秘的面纱,两款新品在硬件参数上并未有革命性创新.在第一次登 ...

  5. 华为畅享6怎么找回计算机,华为畅享6评测:样张中规中矩、续航强悍

    相机 首先来提一下相机参数,华为畅享6采用的是前置500万像素+后置1300万像素的组合,镜头为大广角镜头,前置摄像头视角83度,后置80度,更大的视角能拍出更加有张力的照片.至于具体怎样,还得看样张 ...

  6. android 红米拍照问题,拍照表现中规中矩_小米 红米_手机Android频道-中关村在线...

    在拍照方面,联通版红米手机的主摄像头像素为800万,其拍照方面的基础功能虽然比主打拍照的智能手机要少一些,但整体相对来说,其拍照功能还是比较丰富的,我们常用的全景拍摄.HDR.滤镜.ISO调节等都有, ...

  7. 中规中矩的输入两个正整数m和n,求其最大公约数和最小公倍数。

    求取最大公约数有三种方法:## 短除法 把两个数一直除以它们的公约数,取它们的商继续除,直到无约数可除为止.然后把约数全部乘起来,即为最大公约数. 欧几里德算法(辗转相除法) 在两个数中,找出大数.用 ...

  8. SendMessage功能(中规中矩)

    1.使用原因: 在Android系统中已经存在发送短信的应用,但是如果我们在开发其他应用时需要集成发送短信功能,则很方便. 2.样图: 3.下面代码: xml文件(其实是三个空间就好了,两个文本框,一 ...

  9. ldquo;未来middot;互联网rdquo;论坛:演讲环节中规中矩,媒体访谈出现ldquo;笑话rdquo;

    8月17日,中国互联网协会与谷歌公司共同主办的"互联网·未来"高端论坛在北京召开.Google(谷歌)全球副总裁.首席互联网专家Vinton Cerf博士出席并发表了主题演讲.这位 ...

最新文章

  1. 使用 Python 开发一个恐龙跑跑小游戏,玩起来
  2. Web开发人员为什么越来越懒了?
  3. 关于Python中if、for、with、list、dict的练习题
  4. jbl调音软件_[马自达] 佛山马自达昂克赛拉改装美国JBL汽车音响
  5. linux 新建用户、用户组 以及为新用户分配权限
  6. ajax中res和req,javascript – 来自AJAX调用的res.redirect
  7. 阿里巴巴的程序员们来相亲啦!择偶标准大公开,瞬间吸引一众家长
  8. python socket监听端口_Python 用socket模块实现检测端口和检测web服务
  9. java 启动内存参数_请问该如何设置Java虚拟机JVM启动内存参数?
  10. 武器系统仿真技术(二):末端制导系统蒙特卡洛仿真法
  11. C++ 读取txt文件方法读取速度比较
  12. 暴力破解-----token验证
  13. 几台服务器做虚拟化,4台服务器虚拟化教程(多台服务器虚拟成一台)
  14. Coablt strike官方教程中文版
  15. 安装NET Framework 错误代码0x800F081F怎么解决
  16. Proxifier Socks5 代理(内网访问、远程办公)
  17. 借一道leetcode思考总结map/set的应用及区别
  18. zeppelin源码分析(1)——编译、调试和maven modules分析
  19. python网球比赛模拟主持稿_主持人大赛的模拟主持稿件模板推荐
  20. 泛微OA实施要点总结-立哥技术经验

热门文章

  1. echarts 重新加载数据
  2. 女生学计算机和师范类哪个好,什么专业适合女生学
  3. 一文带你盘点市场上主流的BI产品主要有哪些
  4. JMeter(二十一):使用BeanShell解析Json格式的报文
  5. 劳易测BCB G40 H47 L030 - 条码带
  6. 上海产品运营招聘面试技巧分析
  7. Python基本环境配置
  8. 有多厉害?首互联网卫星发射 飞机高铁WiFi就靠它了
  9. 屏蔽第三方SDK权限
  10. 2021小迪网络安全渗透培训—学习笔记打卡