标签:type 方式 article div 调用 等等 point ring mat
通知:
aspect:把某个类作为切面类,如下,MoocAspect类即为切面类
切入点:
等等
例如:
这个表示切入点为biz包下所有后缀为“Biz”类里的所有方法;切面为MoocAspect类;
advisor(通知):例:
前置通知,在切面类里定义好before方法;
在定义通知方法中,比较特殊的是arround Advice,应该该通知方法的第一个参数必需是ProceedingJoinPoint类型的,如:
结果:
其中打印出的bIz表示的则是业务类的内容,实现了环绕通知
如果要绑定某个方法进行环绕通知,需要在配置时指定所环绕方法的参数类型与参数名称:
且在切面类中定义环绕方法aroundInit时也需要在第一个ProceedingJoinPoint类型参数后添加相应的参数:
这样就实现了环绕通知方法对某个具体方法的通知,且可以避免因重方法名导致的指定不一的问题
advice各个通知的顺序:
、
为了给业务类提供新增的方法:
配置如下
types-matching:表示所对应的业务类
implement-interface:表示所要引用的接口
default-impl:表示所要引用接口的实例类
测试的时候:
这样就可以调用到FitImpl接口实现类里的方法filter()了。
注意:
实现方式不同
< aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。
这个就是advisor实现前通知和后通知需要继承的接口;以下是配置:
<bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean> <aop:config> <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/> <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/> </aop:config> <bean id="human" class="com.ghs.aop.Human"/>
这个是正常的aspect的配置:
<bean id="sleepHelperAspect" class="com.ghs.aop.SleepHelperAspect"></bean> <aop:config> <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/> <aop:aspect ref="sleepHelperAspect"> <!--前置通知--> <aop:before method="beforeSleep" pointcut-ref="sleepPointcut"/> <!--后置通知--> <aop:after method="afterSleep" pointcut-ref="sleepPointcut"/> </aop:aspect> </aop:config> <bean id="human" class="com.ghs.aop.Human"/>
用aspect切面类里的方法就无需继承Advice类,而只需要定义好指定的方法beforeSleep和afterSleep就好;
使用场景不同
< aop:advisor>大多用于事务管理。
例如:
<!-- 会重复读,不会脏读事务 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" timeout="120" propagation="REQUIRED" rollback-for="Exception" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <aop:pointcut id="txPointCut" expression="..."/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>
而< aop:aspect>大多用于日志,缓存
AOP各种API
标签:type 方式 article div 调用 等等 point ring mat
原文地址:https://www.cnblogs.com/lzj-learn/p/12714691.html