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
答案 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
注释。