`

spring管理统一异常spring AOP的异常拦截 .

 
阅读更多

系统的异常处理机制是衡量一个系统设计的关键因素,良好的异常处理机制能在系统出现异常时准确的找到问题的所在。

spring aop对异常的处理有良好的支持。spring 提供了一个接口 ThrowsAdvice,该接口里面没有任何方法,但是实现类里面必须的实现

afterThrowing(Method method, Object[] args, Object target, RuntimeException  throwable) 或者

afterThrowing(RuntimeException  throwable)

 

如果需要记录发生异常方法的详细信息,则实现第一个方法就行,如果只记录发生的异常,实现第二个方法就ok!

 

那么异常的处理应该在什么位置来做处理呢?

一般我们的系统都应该有以下几个层次:Action--->Service---->DAO

 

DAO负责直接和数据库打交道,也是发生异常频率较高的地方,而service只是调用DAO所提供给外面的接口,action里面大部分的操作也是调用service的服务,再加上少数其他的逻辑,这部分的异常可以单独处理!下面我们主要关心DAO层的异常处理。

 

1、定义接口

 

 

  1. package com.beckham.dao;  
  2. import java.util.List;  
  3. import com.beckham.model.User;  
  4. /** 
  5.  *  @author Owner 
  6.  *  Jan 19, 2010   10:15:32 PM 
  7.  *   
  8.  *  struts2 
  9.  *  com.beckham.dao 
  10.  *  UserDAO.java 
  11.  */  
  12. public interface UserDAO {  
  13.     public boolean userExsit(String username) throws Exception;  
  14.     public User findById(int id) throws Exception;  
  15.     public List<User> queryUser(String hql,int beginIndex) throws Exception;  
  16.     public void saveUser(User user) throws Exception;  
  17.     public  int gettotalSize(String hql) throws Exception ;  
  18. }  

 

 

2、实现

 

 

  1. package com.beckham.daoimp;  
  2. import java.util.List;  
  3. import com.beckham.dao.SuperDAO;  
  4. import com.beckham.dao.UserDAO;  
  5. import com.beckham.model.User;  
  6. import com.beckham.util.PropertyUtil;  
  7. /** 
  8.  *  @author Owner 
  9.  *  Jan 19, 2010   10:15:50 PM 
  10.  *   
  11.  *  struts2 
  12.  *  com.beckham.daoimp 
  13.  *  UserDAOImp.java 
  14.  */  
  15. public class UserDAOImp extends SuperDAO implements UserDAO {  
  16.     public User findById(int id) throws Exception {  
  17.         User user = null;  
  18.         try {  
  19.             user = (User) this.getHibernateTemplate().get(User.class, id);  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.             throw new Exception("主键查询用户失败", e);  
  23.         }  
  24.         return user;  
  25.     }  
  26.     public void saveUser(User user) throws Exception {  
  27.         try {  
  28.             this.getHibernateTemplate().save(user);  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.             throw new Exception("增加用户失败", e);  
  32.         }  
  33.     }  
  34.     @SuppressWarnings("unchecked")  
  35.     public List<User> queryUser(String hql, int beginIndex) throws Exception {  
  36.         try {  
  37.             return (List<User>) this.getHibernateTemplate().getSessionFactory()  
  38.                     .getCurrentSession().createQuery(hql).setFirstResult(  
  39.                             beginIndex).setMaxResults(  
  40.                             PropertyUtil.getPageSize()).list();  
  41.         } catch (Exception e) {  
  42.             e.printStackTrace();  
  43.             throw new Exception("查询用户出现异常", e);  
  44.         }  
  45.     }  
  46.     public boolean userExsit(String username) throws Exception {  
  47.         boolean bl = true;  
  48.             String hql = "from User where username='" + username + "'";  
  49.                 if (queryUser(hql, 0).size() == 0) {  
  50.                     bl = false;  
  51.                 }     
  52.         return bl;  
  53.     }  
  54.     public int gettotalSize(String hql) throws Exception {  
  55.         int totalsize = 0;  
  56.         try {  
  57.             totalsize = Integer.parseInt(this.getHibernateTemplate().find(hql)  
  58.                     .get(0).toString());  
  59.         } catch (Exception e) {  
  60.             e.printStackTrace();  
  61.             throw new Exception("查询用户总数失败", e);  
  62.         }  
  63.         return totalsize;  
  64.     }  
  65. }  

 

 

这里需要说明的是,这里的异常我没有细致的分类,都是throws Exception。

 

service层的代码就省略了,因为只是调用DAO层的方法,下面来写异常的拦截

 

 

  1. package com.beckham.aop;  
  2. import java.lang.reflect.Method;  
  3. import org.springframework.aop.ThrowsAdvice;  
  4. /** 
  5.  * @author Owner Jan 18, 2010 2:37:10 PM 处理DAO层的异常 struts2 com.beckham.aop 
  6.  *         ExceptionLog.java 
  7.  */  
  8. public class ExceptionLog implements ThrowsAdvice {  
  9.     /** 
  10.      * Owner  
  11.      * 参数解释 Method method 执行的方法  
  12.      * Object[] args 方法参数 
  13.      *  Object target 代理的目标对象 
  14.      * Throwable throwable 产生的异常  
  15.      * Jan 18, 2010 3:21:46 PM 
  16.      */  
  17.     public void afterThrowing(Method method, Object[] args, Object target,  
  18.             RuntimeException  throwable) {  
  19.         System.out.println("产生异常的方法名称:  " + method.getName());  
  20.           
  21.         for(Object o:args){  
  22.             System.out.println("方法的参数:   " + o.toString());  
  23.         }  
  24.           
  25.         System.out.println("代理对象:   " + target.getClass().getName());  
  26.         System.out.println("抛出的异常:    " + throwable.getMessage()+">>>>>>>"  
  27.                 + throwable.getCause());  
  28.         System.out.println("异常详细信息:   "+throwable.fillInStackTrace());  
  29.     }  
  30. }  

 

 

最后当然就是在配置文件里面配置了

 

 

  1. <bean id="log" class="com.beckham.aop.LogAdvice"></bean>  
  2.     <bean id="exceptionLog" class="com.beckham.aop.ExceptionLog"></bean>  
  3.     <!-- beanName自动代理 -->  
  4.     <bean id="logAdvice"  
  5.         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  6.         <property name="beanNames">  
  7.             <list>  
  8.                 <value>userDAO</value>  
  9.             </list>  
  10.         </property>  
  11.         <property name="interceptorNames">  
  12.         <list>  
  13.             <value>log</value>  
  14.             <value>exceptionLog</value>  
  15.         </list>  
  16.         </property>  
  17.     </bean>  

 

 

到此,通过spring AOP拦截异常就完成了,这里只是拦截DAO层的异常,此方法的好处就是处理异常和功能实现完全分离开,只需要在写方法的时候要记得抛出相应的异常,当出现异常时ThrowsAdvice就会拦截到该异常,并获取该异常的详细信息。

分享到:
评论

相关推荐

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    spring-aop-jar

    Spring AOP模块提供了实现AOP规范的功能,它允许开发者定义“切面”来封装系统中的横切关注点,如日志、事务管理等。该jar文件包含了Spring AOP的核心类和接口,如`org.springframework.aop.*`包下的`...

    Spring开发包含的各种包com.springsource.org.aopalliance-1.0.0.jar

    2. **Spring AOP**:Spring框架提供了自己的AOP实现,它基于代理模型,可以对方法调用进行拦截。Spring AOP可以与Spring的IoC容器无缝集成,方便地实现切面的创建和管理。 3. **AspectJ**:AspectJ是一个强大的AOP...

    spring-aop.xsd

    Spring AOP是Spring框架的重要组成部分,它提供了面向切面编程的能力,使得开发者可以在不修改源代码的情况下对程序进行横切关注点(如日志、事务管理等)的处理。`spring-aop.xsd`文件是Spring AOP配置的XML Schema...

    com.springsource.org.aopalliance-1.0.0.jar.zip

    方法拦截器可以在方法调用前、调用后或抛出异常时进行干预,实现诸如日志记录、性能监控、事务管理等切面逻辑。 2. `org.aopalliance.intercept.Interceptor`: 这是一个更抽象的接口,它是`MethodInterceptor`的超...

    com.springsource.org.aopalliance-1.0.0的jar包

    例如,在Spring框架中,我们可以通过实现这个接口来创建自定义的AOP拦截器,实现如事务管理、缓存控制等功能。 `Interceptor`接口则是AOP联盟的通用拦截器接口,它可以被任何AOP框架所使用。虽然`Interceptor`接口...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    spring-aop.rar_aop1270_spring_spring aop

    Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...

    springaop拦截controller日志

    "springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...

    Spring使用AOP的三个jar包

    它定义了一些通用的AOP接口,比如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,使得不同的AOP框架(如Spring和AspectJ)可以共享相同的拦截器(interceptors)。...

    springMVC AOP拦截拦截Controller等实现日志管理

    如果方法抛出异常,我们可以捕获并记录它,从而实现异常管理。 通过这种方式,我们可以在Spring MVC中利用AOP实现对Controller方法的透明日志管理,不仅记录正常流程,也能捕获和记录异常,提升系统的可维护性和...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...

    spring-aop.rar_java aop_spring aop

    【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...

    Spring_aop.rar_spring aop

    在Java Web开发中,Spring AOP(面向切面编程)是一种强大的工具,它允许开发者将关注点分离,提高代码的可重用性和可维护性。本文将深入探讨Spring AOP的核心概念、工作原理以及如何在实际项目中应用。 **1. ...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    spring aop 拦截器简单实现

    本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...

    spring_aop.zip

    在Spring AOP中,AOP Alliance接口如org.aopalliance.intercept.MethodInterceptor和org.aopalliance.aop.Advice是关键,它们定义了拦截器和通知(Advice)的行为。开发者可以实现这些接口来创建自定义的通知,例如...

    aspectjrt.jar+aspectjweaver.jar+com.springsource.org.aopalliance.jar

    `com.springsource.org.aopalliance.jar`是AOP Alliance的实现,它提供了一套统一的接口,使得不同的AOP框架(如Spring AOP和AspectJ)之间可以互相协作。AOP Alliance定义了两个主要接口:`org.aopalliance....

    org.springframework.web.jar

    5. **Exception Handling**:Spring MVC允许开发者定义全局和局部的异常处理器,通过`@ExceptionHandler`注解处理特定类型的异常,提供统一的错误页面或者JSON响应。 6. **RESTful Support**:Spring Web还支持...

    spring aop_aopalliance.jar_aspectjweaver.jar

    在Spring AOP中,你可以使用这些接口来实现自定义的拦截器,从而在方法调用前后插入额外的功能,如日志记录、事务管理等。 接着,我们来看`aspectjweaver.jar`。AspectJ是Spring AOP支持的一个强大的第三方AOP框架...

Global site tag (gtag.js) - Google Analytics