使用@AfterThrowing Annotation 可以标注一个AfterThrowing增强,处理程序中未处理的异常
在使用@AfterThrowing Annotation时,可以指定以下两个属性
(1)pointcut:指定切入点对应的切入表达式
(2)throwing:功能是一个返回值形参名,增强处理定义的方法可以通过该形参名来访问目标方法中抛出的异常对象
public interface IUserDao { public void save(); public void update(); public void delete(); }
@Repository public class UserDaoIm implements IUserDao{ public void save() { int i=5/0; System.out.println("保存用户信息"); } public void update() { System.out.println("更新用户信息"); } public void delete() { System.out.println("删除用户信息"); } }
@Aspect public class Throw { @AfterThrowing(throwing="ex",pointcut="execution(* save(..))") public void dealException(Throwable ex){ System.out.println("目标函数抛出异常"+ex.getMessage()); } }
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> <context:component-scan base-package="annotation.**"></context:component-scan> <bean id="advice" class="annotation.Advice"></bean> <bean id="throw" class="annotation.Throw"></bean> <!-- <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean> -->
public class Test { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("annotation/beam.xml"); //获取代理lei IUserDao userDao=(IUserDao)context.getBean("userDaoIm"); userDao.save(); } }
开始事务提交 目标函数抛出异常/ by zero Exception in thread "main" java.lang.ArithmeticException: / by zero at annotation.UserDaoIm.save(UserDaoIm.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:55) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80) at annotation.Advice.adviceMethod(Advice.java:13) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy9.save(Unknown Source) at annotation.Test.main(Test.java:13)
相关推荐
4. **AfterThrowing增强处理**: `@AfterThrowing`注解在目标方法抛出未处理异常时执行。`throwing`属性用于指定一个参数名,可以获取到抛出的异常对象: ```java @AfterThrowing(pointcut = "execution(* ...
在IT行业中,Spring框架是Java企业级应用...通过合理利用`AfterThrowing`,我们可以使代码更加整洁,同时增强系统的异常处理能力。在实际项目中,结合其他通知类型,可以构建出灵活且易于维护的面向切面的解决方案。
通过`@AfterThrowing`注解,我们可以捕获并处理特定类型的异常: ```java @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex") public void handleException(Exception ex...
在Spring中,`ThrowsAdvice`是一个重要的概念,它用于处理异常,提供了一种灵活的方式来增强方法的异常处理逻辑。这篇博客文章将通过一个具体的例子深入探讨如何在Spring中使用`ThrowsAdvice`。 `ThrowsAdvice`是一...
- Spring AOP支持使用`@Aspect`注解声明切面,`@Before`, `@After`, `@Around`, `@AfterReturning`, `@AfterThrowing`注解用于声明不同的通知类型,这些注解可以指定切入点表达式,并在匹配的方法执行时应用通知。...
3. 异常增强(After Throwing):在目标方法抛出异常后调用,可以通过`@AfterThrowing`注解定义。 4. 环绕增强(Around):最强大的一种增强,可以控制目标方法的整个执行流程,通过`@Around`注解定义。 5. 最终...
在IT行业中,Spring框架是Java企业级应用开发的首选,其AOP(面向切面编程)模块更是提供了强大的功能,让我们能够实现灵活的代码逻辑控制...在日常开发中,熟练掌握这一特性,无疑会增强你作为一名IT专业人士的技能。
为了确保捕获所有未被捕获的异常,开发者可能使用了`@AfterThrowing`注解来标记这个后置通知,并且切入点表达式可能是`@WithinController`或者其他更广泛的表达式,如`execution(* com.yourpackage..*.*(..))`,以...
1. 注解驱动的切面:使用`@Aspect`注解定义一个类作为切面,然后在类内部使用`@Before`, `@After`, `@AfterReturning`, `@AfterThrowing` 和 `@Around` 注解定义通知。切点表达式可以在注解中直接写,或者通过`@...
5. **资源处理**:Spring 3.1增强了对静态资源的处理能力,比如支持Gzip压缩和Etag头,提高了Web应用的性能。 6. **Bean生命周期管理**:在3.1版本中,`@PostConstruct`和`@PreDestroy`注解可用于标记初始化和销毁...
AOP通过代理机制实现了这一目标,代理可以在方法调用前后插入额外的代码,实现对原有功能的增强。 在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。 1. **静态代理**:在静态代理中,我们需要手动创建...
在Spring Boot应用中,过滤器(Filter)、拦截器(Interceptor)和切面(Aspect)都是实现请求处理逻辑增强的重要手段,而定时任务则用于执行周期性的后台任务。下面将详细介绍这些概念及其用法。 1. **Spring Boot...
同时,`@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`和`@Around`注解使得定义通知变得更加直观。 3. **类型安全的集合注入**: Spring 2.5引入了类型安全的集合注入,可以确保在注入集合时,元素类型...
通过@Transactional注解,我们可以声明方法需要在事务中执行,Spring会自动处理事务的开启、提交或回滚。例如: ```java @Repository public class UserRepository { @Autowired private JdbcTemplate ...
5. 异常处理:通过@AfterThrowing通知,可以轻松捕获和处理方法抛出的异常。 6. 切点表达式的增强:Spring 4.0引入了更多的切入点表达式关键字,使定位方法更加灵活。 在实际开发中,Spring AOP的应用场景广泛,...
例如,使用Spring框架时,可以通过注解如@Before、@After、@AfterReturning、@AfterThrowing和@Around来定义切面逻辑,这些注解分别表示在目标方法之前、之后执行,以及在方法正常返回后、异常返回后、方法执行前后...
在增强处理方法中,我们可以通过`JoinPoint`或`ProceedingJoinPoint`来获取目标方法的相关信息,例如参数、签名、目标对象和代理对象。例如,获取目标方法参数: ```java Object[] args = jp.getArgs(); ``` 或者...
3. **Advice(通知/增强处理)**:在切面的某个特定连接点上执行的动作。根据其执行时机不同,Spring 支持以下几种类型的通知: - `Before`:在方法执行前执行。 - `After`:无论方法是否成功执行,都会在其后执行...
6. **Spring 增强(Advice)**:Spring 提供了多种类型的 Advice,如 BeforeAdvice(前置增强),AfterReturnAdvice(后置增强),AfterThrowing(异常后增强)和 AroundAdvice(环绕增强),用于在方法调用的不同...