Spring对Aop的支持
Spring提供了4种类型的AOP支持:
- 基于代理的经典Spring AOP;
 - 纯POJO切面;
 - @AspectJ注解驱动的切面;
 - 注入式AspectJ切面(适用于Spring各版本)。
 
Spring在运行时通知对象通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中。代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。直到应用需要被代理的bean时,Spring才创建代理对象。如果使用的ApplicationContext的话,在ApplicationContext从BeanFactory中加载所有bean的时候,Spring才会创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要特殊的编译器来织Spring AOP的切面。
注解通知
@After 通知方法会在目标方法返回或抛出异常后调用
@AfterReturning 通知方法会在目标方法返回后调用
@AfterThrowing 通知方法会在目标方法抛出异常后调用
@Around 通知方法会将目标方法封装起来
@Before 通知方法会在目标方法调用之前执行
Audience使用到了前面五个注解中的三个。takeSeats()和silence CellPhones()方
法都用到了@Before注解,表明它们应该在演出开始之前调用。applause()方法使用了
@AfterReturning注解,它会在演出成功返回后调用。demandRefund()方法上添加了
@AfterThrowing注解,这表明它会在抛出异常以后执行。
你可能已经注意到了,所有的这些注解都给定了一个切点表达式作为它的值,同时,这四个方
法的切点表达式都是相同的。其实,它们可以设置成不同的切点表达式,但是在这里,这个切
点表达式就能满足所有通知方法的需求。让我们近距离看一下这个设置给通知注解的切点表
达式,我们发现它会在Performance的perform()方法执行时触发。
相同的切点表达式我们重复了四遍,这可真不是什么光彩的事情。这样的重复让人感觉有些
不对劲。如果我们只定义这个切点一次,然后每次需要的时候引用它,那么这会是一个很好的
方案。
                    
                
                
            
        
浙公网安备 33010602011771号