我很茫然……我遵循了Intro to AspectJ中的步骤,但是当我尝试使用ajc编译示例时,我得到了“ ajc:在learning.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) {
}
}
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实现。有人可以阐明我所缺少的明显观点吗?
答案 0 :(得分: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运行测试都可以很好地工作。
享受!