宁国网站设计公司,营口手机网站建设,建设银行网银登录,智慧团建管理系统一、MethodInterceptor 在动态代理中要想添加一个额外功能#xff0c;只要去实现MethodBeforeAdvice这个接口就行了#xff0c;但是实现了这个接口的额外功能只能运行在目标类执行之前#xff0c;如果是想在目标类执行之后呢#xff1f;那这个需求就完成不了#xff0c;所…一、MethodInterceptor 在动态代理中要想添加一个额外功能只要去实现MethodBeforeAdvice这个接口就行了但是实现了这个接口的额外功能只能运行在目标类执行之前如果是想在目标类执行之后呢那这个需求就完成不了所以我们这里引入一个新的接口MethodInterceptor方法拦截器使用这个接口可能完成在目标类执行的各个时间段都能成功执行。
这里的包一定要导正确
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;public class Around implements MethodInterceptor {// methodInvocation是目标对象中需要添加额外功能的方法Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {// 这里的proceed方法代表的就是目标方法运行Object ret methodInvocation.proceed();//如果想要额外功能运行在目标方法之后就在proceed方法后加上额外功能就行了System.out.println(-------额外功能运行在目标方法后-------log);// 这里的返回值其实就是目标方法的返回值return ret;}
}
将这个拦截器完成了之后也是需要在配置文件中创建对象的
bean idaround classcom.gl.demo.proxy.Around/
创建了这个对象之后引入额外功能的配置文件就不再是Before类了而是这个Around类切入点还是所有的方法
bean iduserService classcom.gl.demo.proxy.UserServiceImpl/bean idaround classcom.gl.demo.proxy.Around/aop:configaop:pointcut idpc expressionexecution(* *(..))/aop:advisor advice-refaround pointcut-refpc/
/aop:config
利用之前的测试代码这里发现额外功能已经添加完成了并且是在目标方法运行之后
public void test2() {ApplicationContext ctx new ClassPathXmlApplicationContext(spring-config2.xml);UserService userService (UserService) ctx.getBean(userService);userService.register();userService.login();
} 实现MethodInterceptor接口可以让我们的额外功能变得更加灵活其实这里不只是能运行在目标方法之后其实还可以前后都运行我们常说的环绕通知、也可以在抛出异常之后运行等这里就不再演示了