Spring框架学习记录之异常抛出增强和最终增强
CreateBy:雀雀
Date:2018.5.29
概念(图片来源于网络):
示例:异常抛出增强
声明异常的类
public class UserDaoImpl implements UserDao {
public void save(User user) {
// 这里并未实现完整的数据库操作,仅为说明问题
System.out.println("保存用户信息到数据库");
throw new RuntimeException("为测试程序运行效果抛出的异常");
}
}增强处理类
public class ErrorLogger {
private static Logger log = Logger.getLogger(ErrorLogger.class);
public void afterThrowing(JoinPoint joinPoint,RuntimeException e){
log.error("调用" + joinPoint.getSignature().getName() + "方法发生异常,"+ e );
}注入异常增强处理(重点:aop:after-throwing 就是定义异常增强处理的标签元素)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<bean id="dao" class="dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="service.impl.UserServiceImpl">
<property name="dao" ref="dao"></property>
</bean>
<!-- 声明增强方法所在的Bean -->
<bean id="errorLogger" class="aop.ErrorLogger"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="pointcut" expression="execution(* service.UserService.*(..))" />
<!-- 引用包含增强方法的Bean -->
<aop:aspect ref="errorLogger">
<!-- 将afterThrowing()方法定义为异常抛出增强并引用pointcut切入点 -->
<!-- 通过throwing属性指定为名为e的参数注入异常实例 -->
<aop:after-throwing method="afterThrowing"
pointcut-ref="pointcut" throwing="e" />
</aop:aspect>
</aop:config>
</beans>运行结果
[ERROR] 2018-05-29 14:53:17,476 aop.ErrorLogger - 调用addNewUser方法发生异常,java.lang.RuntimeException: 为测试程序运行效果抛出的异常
java.lang.RuntimeException: 为测试程序运行效果抛出的异常
示例:最终增强
需要经过最终增强处理的类
public class UserDaoImpl implements UserDao {
public void save(User user) {
// 这里并未实现完整的数据库操作,仅为说明问题
System.out.println("保存用户信息到数据库");
// throw new RuntimeException("为测试程序运行效果抛出的异常");
}
}最终增强处理类
public class AfterLogger {
private static Logger log = Logger.getLogger(AfterLogger.class);
public void after(JoinPoint joinPoint){
log.info("调用" + joinPoint.getSignature().getName() + "方法结束了");
}
}注入最终增强(重点:aop:after 就是最终增强的标签元素)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<bean id="dao" class="dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="service.impl.UserServiceImpl">
<property name="dao" ref="dao"></property>
</bean>
<!-- 声明增强方法所在的Bean -->
<bean id="afterLogger" class="aop.AfterLogger"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="pointcut" expression="execution(* service.UserService.*(..))" />
<!-- 织入增强处理 -->
<aop:aspect ref="afterLogger">
<!-- 将after()方法定义为最终增强并引用pointcut切入点 -->
<!-- 通过throwing属性指定为名为e的参数注入异常实例 -->
<!--aop:after 就是最终增强的标签元素-->
<aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>
<!--
结果:也会调用最终增强处理的方法
[DEBUG] 2018-05-29 15:47:03,185 org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'afterLogger'
[INFO] 2018-05-29 15:47:03,187 aop.AfterLogger - 调用addNewUser方法结束了
-->
Spring框架学习记录之异常抛出增强和最终增强
最新推荐文章于 2023-02-23 23:27:30 发布