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/