springframework(九)AOP的advices,中规中矩的使用方式
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,中规中矩的使用方式相关推荐
- 打破“中规中矩”,手机QQ何以萌翻众人?
随着移动互联网的迅猛发展,越来越多的手机应用展现在了用户面前,不过,面对林林总总的手机应用,有时候我们却提不起兴趣,因为功能的同质化,UI的千篇一律已经让我们多少有些审美疲劳的感觉. 不过,最近手机Q ...
- PTA练习7-2 求最大值及其下标 (20 分)-中规中矩
综述: 本题总体中规中矩,只有一个问题,就是打印第一个最大数的下标,当输入一串数字的时候可能最大的那个数字不止一个,那么当我们找到第一个最大数的时候就可以打印最大数以及下标了. 题目: 本题要求编写程 ...
- OPPO A35上手简评:一款中规中矩的入门级智能手机
5G时代的到来,5G手机成为主流已是大势所趋,但这也并不是说4G手机已经"销声匿迹"了.根据电商平台的销量数据显示,4G手机依旧畅销.换句话说,即便5G手机流行,4G手机的购买价值 ...
- 名人热议新iPhone:5S中规中矩5C莫名其妙
在微博上,iPhone 5s与5c的外观.性能以及缺乏竞争力的价格,都成为了名人们的吐槽点. iPhone 5s与5c在万众瞩目下揭开了并不神秘的面纱,两款新品在硬件参数上并未有革命性创新.在第一次登 ...
- 华为畅享6怎么找回计算机,华为畅享6评测:样张中规中矩、续航强悍
相机 首先来提一下相机参数,华为畅享6采用的是前置500万像素+后置1300万像素的组合,镜头为大广角镜头,前置摄像头视角83度,后置80度,更大的视角能拍出更加有张力的照片.至于具体怎样,还得看样张 ...
- android 红米拍照问题,拍照表现中规中矩_小米 红米_手机Android频道-中关村在线...
在拍照方面,联通版红米手机的主摄像头像素为800万,其拍照方面的基础功能虽然比主打拍照的智能手机要少一些,但整体相对来说,其拍照功能还是比较丰富的,我们常用的全景拍摄.HDR.滤镜.ISO调节等都有, ...
- 中规中矩的输入两个正整数m和n,求其最大公约数和最小公倍数。
求取最大公约数有三种方法:## 短除法 把两个数一直除以它们的公约数,取它们的商继续除,直到无约数可除为止.然后把约数全部乘起来,即为最大公约数. 欧几里德算法(辗转相除法) 在两个数中,找出大数.用 ...
- SendMessage功能(中规中矩)
1.使用原因: 在Android系统中已经存在发送短信的应用,但是如果我们在开发其他应用时需要集成发送短信功能,则很方便. 2.样图: 3.下面代码: xml文件(其实是三个空间就好了,两个文本框,一 ...
- ldquo;未来middot;互联网rdquo;论坛:演讲环节中规中矩,媒体访谈出现ldquo;笑话rdquo;
8月17日,中国互联网协会与谷歌公司共同主办的"互联网·未来"高端论坛在北京召开.Google(谷歌)全球副总裁.首席互联网专家Vinton Cerf博士出席并发表了主题演讲.这位 ...
最新文章
- 使用 Python 开发一个恐龙跑跑小游戏,玩起来
- Web开发人员为什么越来越懒了?
- 关于Python中if、for、with、list、dict的练习题
- jbl调音软件_[马自达] 佛山马自达昂克赛拉改装美国JBL汽车音响
- linux 新建用户、用户组 以及为新用户分配权限
- ajax中res和req,javascript – 来自AJAX调用的res.redirect
- 阿里巴巴的程序员们来相亲啦!择偶标准大公开,瞬间吸引一众家长
- python socket监听端口_Python 用socket模块实现检测端口和检测web服务
- java 启动内存参数_请问该如何设置Java虚拟机JVM启动内存参数?
- 武器系统仿真技术(二):末端制导系统蒙特卡洛仿真法
- C++ 读取txt文件方法读取速度比较
- 暴力破解-----token验证
- 几台服务器做虚拟化,4台服务器虚拟化教程(多台服务器虚拟成一台)
- Coablt strike官方教程中文版
- 安装NET Framework 错误代码0x800F081F怎么解决
- Proxifier Socks5 代理(内网访问、远程办公)
- 借一道leetcode思考总结map/set的应用及区别
- zeppelin源码分析(1)——编译、调试和maven modules分析
- python网球比赛模拟主持稿_主持人大赛的模拟主持稿件模板推荐
- 泛微OA实施要点总结-立哥技术经验