我正在学习Spring Core认证,对AOP命名切入点有以下疑问
例如,我可以将以下代码放入 XML 配置文件中,该文件定义了无名称的 pointut:
<aop:config>
<aop:aspect ref=“propertyChangeTracker”>
<aop:before pointcut=“execution(void set*(*))” method=“trackChange”/>
</aop:aspect>
</aop:config>
<bean id=“propertyChangeTracker” class=“example.PropertyChangeTracker” />
这应该按以下方式工作:
首先,它将切入点定义为名称以set开头且采用单个参数(任何类型)返回void的所有方法。
并且将advice定义为example.PropertyChangeTracker类中的trackChange()方法
因此,当在应用程序生命周期中调用 setter 方法时,它会自动调用类 example.PropertyChangeTracker 中的 trackChange() 方法。
好的,这很简单。
现在我有这个 AOP XML 配置,其中包含命名切入点:
<aop:config>
<aop:pointcut id=“setterMethods” expression=“execution(void set*(*))”/>
<aop:aspect ref=“propertyChangeTracker”>
<aop:after-returning pointcut-ref=“setterMethods” method=“trackChange”/>
<aop:after-throwing pointcut-ref=“setterMethods” method=“logFailure”/>
</aop:aspect>
</aop:config>
<bean id=“propertyChangeTracker” class=“example.PropertyChangeTracker” />
与第一个配置一样,切入点仍然与某些特定的setter方法相关(但在这种情况下,建议分别是返回后和抛出后。
定义的建议是example.PropertyChangeTracker中定义的trackChange()和logFailure()方法强>类。
与第一个示例不同,这两个建议定义了一个由 pointcut-ref=“setterMethods” 的值表示的名称。但到底是什么意思呢?可以用来做什么?
Tnx
最佳答案
问题很长,答案很简单:您可以通过名称引用切入点,因此,如果您有多个引用同一切入点的建议,则只需在一处更改它并保持引用不变。这类似于在 Java 代码中使用变量与文字。
看看你自己的例子:两个通知trackChange
和logFailure
都使用相同的切入点,这相当方便。 DRY——不要重复自己。 ;-) 有时切入点比你的更复杂一点,它们在复杂的场景中可以跨越多行。
关于java - Spring AOP 命名切入点到底是如何工作的?有何用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27422220/