1

我正在尝试向我的应用程序添加一个非常简单的方面,该方面负责监视实体的更改。基本上,我想在一个类中的 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* 之类的通配符时,永远不会调用建议。

我认为这里可能存在一个我不知道的更根本的问题。有人有想法么?

4

1 回答 1

1

在您的情况下,您需要为您的类使用代理,或者您可以实现 MethodInterceptor 而不是 Aspect。因为 Spring AOP 仅适用于 Spring 托管 bean。

例子:

@Component
public class Interceptor implements MethodInterceptor {


@Override
public Object invoke(MethodInvocation invocation) throws Throwable {

 ....do your stuff

   }

}
于 2018-01-08T09:51:51.053 回答