AspectJ使用ajc和IntelliJ进行编织

问题描述 投票:0回答:1

我不知所措......我已经按照Intro to AspectJ的步骤进行了操作,但是当我尝试使用ajc编译样本时,我得到了一个“ajc:在学习中定义的建议.AccountAspect尚未应用[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) {
    }
}

account test.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和PostSharp的C#风格有一般的了解和体面的经验,但我不能围绕AspectJ实现。有人能说清楚我错过了什么明显的观点吗?

java intellij-idea aop aspectj
1个回答
1
投票

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

问题必须出在构建或IDE设置中,而不是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存储库中删除了你的IDEA项目文件,并简化/改进了.gitignore文件。所有这些变化都可以在我的pull request中找到并进行审核。

现在使用mvn clean test构建的Maven以及从IntelliJ IDEA运行测试都可以很好地工作。

请享用!

© www.soinside.com 2019 - 2024. All rights reserved.