java - 使用 AspectJ 询问安全提款/存款

标签 java aspectj

我对让 BankAccount 类实现安全提款/存款功能有疑问。到目前为止,当您向bankAccount 类提款或存款时,它会打印日志。无论如何,我的问题是如何实现安全性,例如您提取的金额不得超过您银行帐户中当前的金额。如果我不允许在 BankAccount 类中实现该安全性,并且希望将其实现到 AspectJ。

我现在有以下内容。可以看出,无论 if 语句是真还是假,提款都会完成。因此我必须在else语句中存回这笔钱,这样它就不会变成负数。这可以用更好的方式来完成吗?

pointcut checking(BankAccount ba, float x): 
    call(* BankAccount.withdraw(..)) && target(ba) && args(x);                                                                                                   



before(BankAccount b, float x) : checking(b, x) {
    if(b.getBalance() >= x) {
        System.out.println("Account changing. $" + x + " withdrawn..."); 

    } else {               
        System.out.println("Account does not have. $" + x + " to withdrawn...");
        b.deposit(x);
    }

}

最佳答案

我想说,这可以通过 around 建议更好地处理,它可以阻止继续正常调用,并在不允许事务的情况下替换一些其他操作。

around 建议的代码应该基本上与您为 before 编写的代码类似,除了在 if block 中您必须调用 proceed 继续正常执行,在 else block 中,您不再需要调用 deposit

关于java - 使用 AspectJ 询问安全提款/存款,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6008833/

相关文章:

spring - 如何在Spring Boot中对私有(private)/ protected RequestMapping进行AOP

java - 如何告诉maven将项目编译为aspectj项目

java - 如何在 Spring AspectJ 中使用 "declare"指令?

java - 在java计时器中实现aspectj日志记录

java - Spring Security 忽略 successHandler 和 failureHandler

java - 转到另一个 Activity 时 Timer() 函数不起作用

java - 使用 Java 代码访问 DLNA 电视

java - 将武器作为抽象类的接口(interface)有什么优势

java - 将注释对象绑定(bind)到通知主体

java - 使用 docker-compose 启动 solr cloud 时无法使用 java 代码索引数据