非常简单的Spring AOP切入点

时间:2012-10-19 17:18:10

标签: java spring spring-aop

create()切入点工作得很好但是我无法让setStatus()切入点工作但是我尝试...我尝试过@Before,{{1} },@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"/>

修改2

我尝试直接在<aop:aspectj-autoproxy proxy-target-class="false"/>上调用setStatus(),但它也没有抓到。

Subscription

1 个答案:

答案 0 :(得分:2)

  

订阅订阅=新订阅();

     

subscription.setStatus(1);

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

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

或使用@Resource@Autowired注释来注释它们。

然后,对setStatus()对象的subscription的调用将通过Spring框架创建的AOP代理,并且执行与方法定义匹配的AOP建议中的代码。

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