Spring AOP:Xml与AspectJ方法

时间:2014-10-11 23:59:42

标签: java xml spring aop aspectj

所以我的问题围绕着使用基于XML的架构的Spring AOP而不是将其与AspectJ一起使用。从在线环顾四周,我一直在试图找出采取AOP的方法。一个特殊情况让我有些困惑;

假设我有许多具有n个方法的类,并且我想将我的方面类的建议应用于某些方法/连接点但不是全部,我在使用AspectJ时可以看到这相当简单 - 我只需将我的方面注释应用于应该使用建议的方法。但是,根据我所看到的基于xml的方法,我必须为每个方法创建一个切入点(假设它们不能被一个表达式覆盖,即每个方法都有一个不同的名称)和(如果我使用基于代理的方法)每个目标/类的代理类。在这个意义上,AspectJ方法似乎更加整洁。

我对这两种方法的理解是正确的,还是我错过了Spring AOP的某些部分,可以为xml方法实现更简洁的解决方案?

对于冗长的解释感到抱歉,但我希望尽可能明确这个场景......

1 个答案:

答案 0 :(得分:2)

听起来你正在尝试在Spring AOP和AspectJ之间做出决定,但是你假设Spring AOP需要基于XML的配置。它没有。您可以对Spring AOP和AspectJ使用AspectJ注释:

package com.example.app;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;

@Aspect
public class NotificationAspect {
    @Autowired private NotificationGateway notificationGateway;

    @Pointcut("execution(* com.example.app.ItemDeleter.delete(com.example.app.Item))")
    private void deleteItemOps() { }

    @AfterReturning(pointcut = "deleteItemOps() && args(item)")
    public void notifyDelete(Item item) {
        notificationGateway.notify(item, ConfigManagementEvent.OP_DELETE);
    }
}

因此,如果您正在尝试比较Spring AOP和AspectJ,那么将AspectJ与基于注释的Spring AOP进行比较更为明智。

Spring AOP通常更简单(你不需要AspectJ编译器);因此,参考文档建议使用Spring AOP而不是AspectJ,除非你需要更多奇特的切入​​点。

更新:响应下面的OP评论,我们可以使用XML配置来建议具体方法:

<aop:config>
    <aop:pointcut
        id="deleteItemOps"
        expression="execution(* com.example.app.ItemDeleter.delete(com.example.app.Item))" />
    <aop:advisor
        advice-ref="notificationAdvice"
        pointcut-ref="deleteItemOps() && args(item)" />
</aop:config>

如果你想在<aop:advisor>中嵌入切入点,你也可以这样做:

<aop:config>
    <aop:advisor
        advice-ref="notificationAdvice"
        pointcut="execution(* com.example.app.ItemDeleter.delete(com.example.app.Item)) && args(item)" />
</aop:config>

(我没有检查过XML配置的&& args(item)部分,但我认为我给出的例子没问题。如果它不起作用,请尝试删除它并随意编辑相应的答案。)