文档章节

关于spring的ThrowsAdvice (转)

~少司命~
 ~少司命~
发布于 2012/12/14 11:05
字数 363
阅读 175
收藏 0


关于SPRING的AOP

aop的一个切面接口是 ThrowsAdvice,这是个标记接口,里面没有定义任何方法。书上说,根据spring文档,必须定义一个 afterThrowing([Method, args, target], subclassOfThrowable) 形式的方法,前面三个参数可选,也就是你可以写成 afterThrowing( args, target, subclassOfThrowable) ,也可以写成 afterThrowing( target, subclassOfThrowable) 

事实上如果真的这么做,运行时会抛出 At least one handler method must be found in class 形式的异常。在确认自己没有打错字之后,只好去查spring2.0的手册,才发现上面是这么说的:方法可以有一个或四个参数。 也就是说,不能有两个、三个参数,方法的形式只能有两种: afterThrowing([Method, args, target], subclassOfThrowable)  或者 afterThrowing( subclassOfThrowable)

如下例:

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;
import org.springframework.aop.framework.ProxyFactory;

public class ExceptionAdvisor implements ThrowsAdvice {
    public void afterThrowing(RuntimeException rx) {

    }

    /**
     * 对未知异常的处理.
     */
    public void afterThrowing(Method method, Object[] args, Object target, Exception ex) throws Throwable {
        System.out.println("*************************************");
        System.out.println("Error happened in class: " + target.getClass().getName());
        System.out.println("Error happened in method: " + method.getName());

        for (int i = 0; i < args.length; i++) {
            System.out.println("arg[" + i + "]: " + args[i]);
        }

        System.out.println("Exception class: " + ex.getClass().getName());
        System.out.println("*************************************");
    }

    /**
     * 对NumberFormatException异常的处理
     */
    public void afterThrowing(Method method, Object[] args, Object target, NumberFormatException ex) throws Throwable {
        System.out.println("*************************************");
        System.out.println("Error happened in class: " + target.getClass().getName());
        System.out.println("Error happened in method: " + method.getName());

        for (int i = 0; i < args.length; i++) {
            System.out.println("args[" + i + "]: " + args[i]);
        }

        System.out.println("Exception class: " + ex.getClass().getName());
        System.out.println("*************************************");
    }

    public static void main(String[] args) {
        TestBean bean = new TestBean();
        ProxyFactory pf = new ProxyFactory();
        pf.setTarget(bean);
        pf.addAdvice(new ExceptionAdvisor());

        TestBean proxy = (TestBean) pf.getProxy();
        try {
            proxy.method1();
        } catch (Exception ignore) {
            System.out.println("Exception in method1 catch");
        }

        try {
            proxy.changeToNumber("amigo");
        } catch (Exception ignore) {
            System.out.println("Exception in changeToNumber catch");
        }
    }
}

© 著作权归作者所有

共有 人打赏支持
~少司命~
粉丝 3
博文 76
码字总数 8735
作品 0
昌平
高级程序员
咕泡-适配器 adapter 设计模式笔记

适配器模式(Adapter) Spring AOP 模块对BeforeAdvice、AfterAdvice、ThrowsAdvice 三种通知类型的支持实际上是借助适配器模式来实现的 这样的好处是使得框架允许用户向框架中加入自己想要支...

职业搬砖20年
09/04
0
0
Spring AOP增强(Advice)

Sring AOP通过PointCut来指定在那些类的那些方法上织入横切逻辑,通过Advice来指定在切点上具体做什么事情。如方法前做什么,方法后做什么,抛出异常做什么。 再来看一下图 定义PointCut Sp...

艾贺521
07/02
0
0
spring AOP的异常拦截

系统的异常处理机制是衡量一个系统设计的关键因素,良好的异常处理机制能在系统出现异常时准确的找到问题的所在。 spring aop对异常的处理有良好的支持。spring 提供了一个接口 ThrowsAdvice...

村长大神
2015/02/05
0
0
关于SpringAop的一些坑

今天在工作中遇到一个需求:想把之前所有的登录验证,转义到某一处进行统一验证,这样这部分验证登录的代码就不需要重复了 我的思路:自己编写一个注解来区分哪些接口是需要登录,哪一些是不...

孙超飞
2017/11/08
0
0
Spring AOP原理及简单应用

AOP 应用: 1. 监控系统重要API的调用事件,用来监控系统的性能。 2.Authentication 权限 3. Caching 缓存 4. Context passing 内容传递 5. Error handling 错误处理 6. Lazy loading 懒加载...

飓风2000
2014/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

play framework 如何支持多数据源

有段时间没有写博客了,但今天又写一篇了,主要是因为这事有一丝自己的思考和动手实践,所以就记录下来了。 现有的问题: play 1.2.4 两台数据库服务器,但是play1.2.4 并不支持同时连接两台...

tuerqidi
23分钟前
1
0
Mysql only_full_group_by解析

查看当前数据库模式: select @@sql_mode; 原因: mysql 5.7中的sql_mode的值中包含'ONLY_FULL_GROUP_BY'; 处理:执行以下SQL set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,N......

年轻的中年大叔
24分钟前
1
0
防止表单重复提交

1:前端方式(治标不治本) $("#admin-role-save").click(function(){//admin-role-save为submit的idvar ts=$(this);var ts_old_val=ts.val();ts.val("提交中....");ts.att...

uug
25分钟前
1
0
保持屏幕常亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 在act的created方法中调用即可,一般是播放视频的时候......

Carbenson
25分钟前
1
0
智能合约实施指南

与区块链技术一样,智能合约在商业领域也非常有价值。 为了让我们的读者彻底了解智能合约是什么以及它们如何影响现代商业的交易方式,我们准备了本指南。 集中商业模式正在给去中心化的模式让...

geek12345
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部