我正在尝试向我的应用程序添加一个非常简单的方面,该方面负责监视实体的更改。基本上,我想在一个类中的 setter 被这样调用后升起一个标志:
@After("execution(* bg.infosys.avl.transmodel.hibernate.entity.*.set*(*))")
public void entityChangedAdvice(JoinPoint joinPoint){
AvlEntity entity = (AvlEntity) joinPoint.getTarget();
entity.setChanged(true);
}
建议从未运行,因此我开始尝试更简单的测试以找出问题所在。我在一个名为getId()的服务中创建了一个测试方法,并在我的 xml 配置中添加了一个新建议,如下所示:
<context:annotation-config />
<aop:aspectj-autoproxy />
<!-- ADVICE -->
<bean id="avlEntityChangesAdvice" class="bg.infosys.avl.designer.logging.AvlEntityChangesAdvice"></bean>
<aop:config>
<aop:aspect ref="avlEntityChangesAdvice" id="avlEntityChangesAdviceID" order="1">
<aop:pointcut expression="execution(* bg.infosys.avl.designer.facade.*.*(..))" id="getterPointcut"/>
<aop:after method="entityChangeAdvice" pointcut-ref="getterPointcut" />
</aop:aspect>
</aop:config>
每当来自包bg.infosys.avl.designer.facade中任何类的任何方法时,都应该调用它。这行得通!
当我将切入点更改为针对具有特定名称的方法时,如下所示:
<context:annotation-config />
<aop:aspectj-autoproxy />
<!-- ADVICE -->
<bean id="avlEntityChangesAdvice" class="bg.infosys.avl.designer.logging.AvlEntityChangesAdvice"></bean>
<aop:config>
<aop:aspect ref="avlEntityChangesAdvice" id="avlEntityChangesAdviceID" order="1">
<aop:pointcut expression="execution(* bg.infosys.avl.designer.facade.*.getId(..))" id="getterPointcut"/>
<aop:after method="entityChangeAdvice" pointcut-ref="getterPointcut" />
</aop:aspect>
</aop:config>
该建议根本没有被调用。我尝试了各种组合,我尝试了注释,但结果都是一样的。当我尝试针对特定方法或尝试使用诸如 get* 之类的通配符时,永远不会调用建议。
我认为这里可能存在一个我不知道的更根本的问题。有人有想法么?