环绕通知所用的架包和前置通知所用的架包一样,并且在bean中添加aop
通知实现接口MethodInterceptor 并且实现其中的public Object invoke(MethodInvocation invocation)方法 环绕通知的功能非常的强大 它可以实现前置通知,后置通知,和异常通知 前置通知和后置通知在try中实现, 使用result = invocation.proceed();来控制目标方法的执行 写在invocation.proceed();前面的通知,为前置通知 写在invocation.proceed();后面的通知,为后置通知
环绕通知
package all; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class aopAround implements MethodInterceptor{ Object result = null; @Override public Object invoke(MethodInvocation invocation) throws Throwable { try { System.out.println("用环绕通知实现前置通知"); System.out.println("目标对象"+invocation.getThis()+"调用的方法名"+invocation.getMethod().getName()+"方法的参数"+invocation.getArguments().length); // invocation.proceed();之前的代码就是前置通知 result = invocation.proceed();//控制目标方法的执行 addstudent() //执行目标方法的addstudent返回值 // invocation.proceed();之后的代码就是后置通知 System.out.println("用环绕通知实现后置通知"); } catch (Exception e) { //在catch中的就是异常通知 System.out.println("用环绕通知实现异常通知"); } return result;//返回值 } }业务类
package service; import school.student; public class studentService { public void addstudent() { System.out.println("在此之前还有前置通知"); } }在bean中配置
<bean id="aopAround" class="all.aopAround"></bean> <aop:config> <aop:pointcut expression="execution(public void service.studentService.addstudent())" id="poiontcut4"/> <aop:advisor advice-ref="aopAround" pointcut-ref="poiontcut4"/> </aop:config>