java - Spring AOP 表达式已执行但不应该执行

标签 java spring spring-aop

我是Spring的新手,正在尝试理解AOP。这是我得到的

我有一个简单的方面,我想在调用任何非 getter 方法时运行它

@Aspect
@Component
public class LoggingAspect {

    @Pointcut("execution(* org.practice.entity.Person.get*())")
    private void getter() {}

    @Before("!getter()")
    public void noGetter() {
        System.out.println("NO GETTER GETS CALLED");
    }
}

Person 类很简单

@Component
public class Person {
    public void getPerson() {
        System.out.println("GETTING PERSON....");
    }
 }

我正在使用 Java 注释初始化配置

@Configuration
@EnableAspectJAutoProxy
@ComponentScan("org.practice")
public class DemoConfig {}

然后在我的主要方法中我有

public class MyApp {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);
        context.close();
    }
}

如您所见,我只是创建一个上下文并关闭它,而不调用任何 getter 或非 getter 方法。当我运行该程序时,我得到以下控制台输出

NO GETTER GETS CALLED....

这具有半意义,因为我没有调用任何 getter 方法,但我期望只有当我显式调用任何非 getter 而不是通过打开上下文时,此方面才会执行。请告诉我,如果我希望我的业务逻辑仅在调用任何非 getter 方法时才执行,那么我该怎么做?

谢谢

最佳答案

试试这个:

@Pointcut("execution(* org.practice.entity.Person.*())")
     private void methodCall() {}

@Before("!getter() && methodCall")
    public void noGetter() {
        System.out.println("NO GETTER GETS CALLED");
    }

关于java - Spring AOP 表达式已执行但不应该执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47948750/

相关文章:

Java 8 自动装箱 + 泛型 : different behaviour with variable vs. 方法

java - 如何为 EnumSet(MySQL SET 类型)编写 jOOQ 转换器

java - environment.getProperty ("property") 是否产生与 @Value ("property"相同的值)

java - spring mvc 错误: class <> nor any of its super class is known to this context

java - 在数据库中初始化不可变的 JPA 集合

java - Spring AOP 使用方法和参数注解

Spring 嵌套事务处理和嵌套传播

java - 根据收到的参数动态选择 log4j 附加程序

java - 为什么锁在对象上,而不是在 java 中的代码上

java - 我如何使用 spring aop 编写日志记录测试?