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 的测试都运行良好。
尽情享受吧!
我不知所措...我已按照 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 的测试都运行良好。
尽情享受吧!