课时7:后置通知、异常通知
.1)后置通知的实现步骤以及解释
1.导入相应jar包 前置通知示例已经有了 这里就不做过多的讲解
2.编写业务类以及编写后置通知类
2.1 业务类代码如下
package net.bdqn.hbz.service.impl; import net.bdqn.hbz.dao.impl.IStudentDaoImpl; import net.bdqn.hbz.pojo.Student; import net.bdqn.hbz.service.IStudentService; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; public class IStudentServiceImpl implements IStudentService { private IStudentDaoImpl iStudentDao; public void setiStudentDao(IStudentDaoImpl iStudentDao) { this.iStudentDao = iStudentDao; } /** * * @param student */ @Transactional(readOnly = false,propagation = Propagation.REQUIRED) @Override public void addStudent(Student student) { iStudentDao.addStudent(new Student()); } @Override public void deleteStudent(Integer no) { System.out.println("正在删除学生"); } }
2.2 编写后置通知类 需要实现一个接口 AfterReturningAdvice 所有接口都可以参考前置通知的一张图
package net.bdqn.hbz.aop; import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; /** * 前置通知类 */ public class After implements AfterReturningAdvice { /** * * @param o 目标的返回值 * @param method 目标方法 * @param objects 目标参数列表 * @param o1 目标对象 * @throws Throwable */ @Override public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { System.out.println("后置通知:目标对象:"+o1+",目标方法:"+method.getName()+",目标参数个数:"+ objects.length+",目标返回值"+o); } }
3.将切面和切入点进行一个连接
3.1 注入这个后置通知类到SpringIOC容器当中
<bean id="after" class="net.bdqn.hbz.aop.After"></bean>
3.2 配置切面和切入点关联关系
3.2.1 配置切入点信息 (目的就是为了找到这个方法) 以及把切面进行关联
<aop:config> <!-- 配置切入点信息--> <aop:pointcut id="addAfter" expression="execution(public void addStudent(net.bdqn.hbz.pojo.Student))"></aop:pointcut> <!-- 配置连接--> <aop:advisor advice-ref="after" pointcut-ref="addAfter"></aop:advisor> </aop:config>
.2)异常通知
1.导入相应jar包 前置通知示例已经有了 这里就不做过多的讲解
2..编写业务类以及编写后置通知类
2.1 业务类代码如下
package net.bdqn.hbz.service.impl; import net.bdqn.hbz.dao.impl.IStudentDaoImpl; import net.bdqn.hbz.pojo.Student; import net.bdqn.hbz.service.IStudentService; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; public class IStudentServiceImpl implements IStudentService { private IStudentDaoImpl iStudentDao; public void setiStudentDao(IStudentDaoImpl iStudentDao) { this.iStudentDao = iStudentDao; } /** * * @param student */ @Transactional(readOnly = false,propagation = Propagation.REQUIRED) @Override public void addStudent(Student student) { iStudentDao.addStudent(new Student()); } @Override public void deleteStudent(Integer no) { System.out.println("正在删除学生"); } }
2.2编写异常通知类
2.2.1 在实现ThrowsAdvice发现并没有需要我们重写什么方法 但是源码文档中给出提示:
public void afterThrowing([Method, args, target], ThrowableSubclass);
2.2.1.1 这个提示的意思就是[Method, args, target]这些参数可有可无 因为只是异常通知 ,有时候并不需要目标信息.
3.将切面和切入点进行一个连接
3.1 注入这个异常通知类到SpringIOC容器当中
<!-- 注入异常通知类--> <bean id="throw" class="net.bdqn.hbz.aop.Throw"></bean>
3.2 配置切面和切入点关联关系
<!-- 将addStudent 和 异常通知进行关联--> <aop:config> <!-- 配置切入点信息--> <aop:pointcut id="addThrow" expression="execution(public void addStudent(net.bdqn.hbz.pojo.Student))"/> <!-- 配置连接--> <aop:advisor advice-ref="throw" pointcut-ref="addThrow"/> </aop:config>