,每个Advice都是一个Bean。Advice实例可以在所有Advisor之间共享,也可以对每个Advisor对象都是唯一的。这对应于每个类或每个实例的Advice。,最常使用的是每类Advice。它适用于一般的Advice,例如事务Advisors。这些不依赖于代理对象的状态或添加新状态。它们只是对方法和参数起作用。,每个实例Advice适用于引入,以支持mixin。在这种情况下,通知将状态添加到代理对象。,你可以在同一个AOP代理中混合使用共享通知和每个实例通知。,Spring提供了几种通知类型,并且可以扩展以支持任意通知类型。,Spring中最基本的通知类型是围绕通知的拦截。,Spring与AOP Alliance接口兼容,支持使用方法拦截的环绕通知。实现MethodInterceptor和around advice的类还应该实现以下接口:,invoke()方法的MethodInvocation参数公开了被调用的方法、目标连接点、AOP代理和方法的参数。invoke()方法应该返回调用的结果:连接点的返回值。,面的例子展示了一个简单的MethodInterceptor实现:,注意:MethodInvocation中对proceed()方法的调用。这将沿着拦截器链向下直至连接点。大多数拦截器调用此方法并返回其返回值。然而,MethodInterceptor和任何around通知一样,可以返回不同的值或抛出异常,而不是调用proceed方法。然而,如果没有充分的理由,你不会想要这样做。,一个简单的Advice类型是事前Adivce。它不需要MethodInvocation对象,因为它只在进入方法之前被调用。,before通知的主要优点是不需要调用proceed()方法,因此不可能在无意中无法继续执行拦截器链。,注意:返回类型是void。Before通知可以在连接点运行之前插入自定义行为,但不能更改返回值。如果before通知抛出异常,它将停止拦截器链的进一步执行。异常在拦截器链中向上传播。如果未检查或在被调用方法的签名上,它将直接传递给客户端。否则,它将被AOP代理包装在未检异常中。,下面的例子展示了Spring中的before通知,它统计了所有的方法调用:,如果连接点抛出异常,则在连接点返回后调用Throws通知。Spring提供了类型化异常通知。注意,这意味着org.springframework.aop.ThrowsAdvice接口不包含任何方法。它是一个标记接口,标识给定对象实现了一个或多个类型化throws通知方法。格式如下:,Method,args,target3个参数是可选的。,下一个示例声明了4个参数,因此它可以访问被调用的方法、方法参数和目标对象。如果抛出ServletException,将调用以下Advice:,在一个异常通知类中定义多个不同异常的处理,Spring中的后置通知必须实现org.springframework.aop.AfterReturningAdvice接口,如下:,返回通知可以访问返回值(它不能修改)、被调用的方法、方法的参数和目标。,如果它抛出异常,它将被抛出拦截器链,而不是返回值。,Spring将引介通知视为一种特殊的拦截通知。,Introduction需要一个IntroductionAdvisor和一个IntroductionInterceptor实现以下接口:,从AOP Alliance方法拦截器接口继承的invoke()方法必须实现引入。也就是说,如果被调用的方法在引入的接口上,则引入拦截器负责处理方法调用—它不能调用proceed()。,引介通知不能与任何切入点一起使用,因为它只适用于类级别,而不是方法级别。你只能在 IntroductionAdvisor中使用介绍建议,它有以下方法:,没有MethodMatcher,因此也没有与引介通知相关联的切入点。只有类过滤。,getInterfaces()方法返回这个Advisor引入的接口。,validateInterfaces()方法在内部使用,以查看引入的接口是否可以由配置的IntroductionInterceptor实现。下面直接给出示例,该示例的作用就是使某个类不具备某个接口能力时动态给予该接口的能力:,接口:,这里的引介拦截器必须实现我们期望的一个接口:,创建代理处理器:,OrderDAO实现,该DAO并没有实现CountDAO:,测试:,运行结果:,从运行结果看到OrderDAO具备了CountDAO接口能力,而具体实现CountDAO是我们的引介拦截器上实现的。
文章版权声明
1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/19510.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别