java - 非常简单的 Spring AOP 切入点

标签 java spring spring-aop

create()切入点工作得很好,但我无法得到 setStatus()不管我怎么尝试,切入点都可以工作...我已经尝试过 @Before , @After , @AfterReturning ,但什么也没有。

根据调试器的信息,这两种方法都会被调用。

package com.baz;

@Aspect
public class ServiceAspect {
   @Pointcut("execution(* com.foo.ServiceImpl.create(..))")
    public void create() {}

    @Pointcut("execution(* com.bar.Subscription.setStatus(..))")
    public void setStatus() {}

    // works
    @AfterReturning(pointcut="create()", returning="retVal")
    public void afterCreate(Object retVal) {
        // omitted
    }

    // doesn't work
    @Before("setStatus()")
    public void status() {
        // omitted
    }

    // doesn't work
    @Before("setStatus() && args(status)")
    public void status(int status) {
        // omitted
    }

    // doesn't work
    @After("setStatus()")
    public void status() {
        // omitted
    }

    // doesn't work
    @AfterReturning(pointcut="setStatus()")
    public void status2() {
        // omitted
    }

    // doesn't work
    @AfterReturning(pointcut="setStatus()", returning="retVal")
    public void afterSetStatus(Object retVal) {
        // omitted
    }

    // doesn't work
    @Around("setStatus()")
    public Object aroundStatus(ProceedingJoinPoint pjp) throws Throwable {
        Object output = pjp.proceed();
        return output;
    }
}

这些方法如下所示:

public class Subscription extends FooBar implements Baz {
    public void setStatus(int status) { /* ... */ }
}

public class ServiceImpl implements Service {
    public Subscription create(Session session, Subscription template) { /* ... */ }
}

编辑

我尝试过同时使用 <aop:aspectj-autoproxy /> , <aop:aspectj-autoproxy proxy-target-class="true"/><aop:aspectj-autoproxy proxy-target-class="false"/> .

编辑2

我尝试调用setStatus()直接上Subscription ,但它也没有捕获这一点。

Subscription subscription = new Subscription();
subscription.setStatus(1);

最佳答案

Subscription subscription = new Subscription();

subscription.setStatus(1);

对于要应用的方面,订阅应该是 spring 管理的 bean,即您应该从 ApplicationContext 获取 Subscription 类型的对象,如下所示:

ClassPathXmlApplicationContext context = 
    new ClassPathXmlApplicationContext("classpath:META-INF/Spring.xml");
Subscription subscription = context.getBean(Subscription.class);

或者使用@Resource@Autowired注释将它们注入(inject)。

然后,对 subscription 对象上的 setStatus() 的调用将通过 Spring 框架创建的 AOP 代理以及 AOP 建议中与方法定义匹配的代码被处决。

在使用 new 运算符创建对象时,获取 spring 管理的 bean 的另一种方法是使用 @Configurable注释。

关于java - 非常简单的 Spring AOP 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979243/

相关文章:

java - 如何从用户处获取任意数量的参数并将它们传递给使用 varargs( 变量参数 ) 的方法?

java - 我如何从响应中获取 header ,因为 ServletResponse().getHeader(string) 不可见?

java - 如何在各个方法中应用 Spring AOP

java - 解决org.springframework.data.mapping.PropertyReferenceException : No property getOne found for type MyLog

java - 为响应式(Reactive)管道编写方面

spring - spring security内部使用AOP吗?

Java/Swing 音量 slider

具有 HDFS 文件读/写的 Java

java - 使用spring检查旧对象和新对象的变化

java - 在Spring中,advisor和aspect有什么区别?