AspectJ 编织与 ajc 和 IntelliJ

AspectJ weaving with ajc and IntelliJ

我不知所措...我已按照 Intro to AspectJ 中的步骤进行操作,但是当我尝试使用 ajc 编译示例时,我得到 "ajc: advice defined in learning.AccountAspect has not been applied [Xlint:adviceDidNotMatch]" 警告我之前、周围和之后的建议。这是我的完整代码:

Account.java

package learning;


public class Account {
    int balance = 20;

    public boolean withdraw(int amount) {
        if (balance < amount) {
            return false;
        }
        balance = balance - amount;
        return true;
    }
}

AccoutnAspect.aj

package learning;

public aspect AccountAspect {
    final int MIN_BALANCE = 10;

    pointcut callWithDraw(int amount, Account acc) :
            call(boolean Account.withdraw(int)) && args(amount) && target(acc);

    before(int amount, Account acc): callWithDraw(amount, acc) {
    }

    boolean around(int amount, Account acc) :
            callWithDraw(amount, acc) {
        if (acc.balance < amount) {
            System.out.println("Insufficient funds");
            return false;
        }
        System.out.println("Withdrawal approved");
        return proceed(amount, acc);
    }

    after(int amount, Account balance) : callWithDraw(amount, balance) {
    }
}

AccountTest.java

package learning;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class AccountTest {
    private Account account;

    @Before
    public void before() {
        account = new Account();
    }

    @Test
    public void given20AndMin10_whenWithdraw5_thenSuccess() {
        assertTrue(account.withdraw(5));
    }

    @Test
    public void given20AndMin10_whenWithdraw100_thenFail() {
        System.out.println(account.balance);
        assertFalse(account.withdraw(100));
        System.out.println(account.balance);
    }
}

我对 AOP 有一般的了解,并且在 AOP、PostSharp 的 C# 风格方面有不错的经验,但我无法完全理解 AspectJ 的实现。有人可以阐明我遗漏了什么明显的观点吗?

感谢 MCVE。我克隆了它并发现了问题。正如我在之前的评论中所说...

The problem must be in your build or IDE setup, not in AspectJ.

...您遇到了构建管理问题,更准确地说,您的 Maven POM 是错误的。您在 <pluginManagement> 部分配置了 AspectJ Maven,但忘记实际将插件添加到 <plugins> 部分中的 Maven 模块,如下所示:

    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
        </plugin>
    </plugins>

也许您应该先学习一些 Maven 基础知识。顺便说一句,您正在阅读的教程与您在 POM 中所做的不同,因此是问题所在。

此外,插件版本RELEASE不起作用,您确实需要设置一个真实的版本号,如1.11。我也为你做了这件事,另外我从 Git 存储库和 streamlined/improved 你的 .gitignore 文件中删除了你的 IDEA 项目文件。所有这些更改都可以在我的 pull request.

中找到并查看

现在,使用 mvn clean test 构建的 Maven 以及 运行 来自 IntelliJ IDEA 的测试都运行良好。

尽情享受吧!