假设服务接口在包fr.generali.nova.atp.service.metier.api
:
package fr.generali.nova.atp.service.metier.api;
public interface IProduitGeneriqueService {
void valider(ElementNiveauUn element);
}
,服务实现在包fr.generali.nova.atp.service.metier.impl
:
package fr.generali.nova.atp.service.metier.impl;
public class DefaultProduitGeneriqueServiceImpl implements IProduitGeneriqueService {
@Override
@Traceable(value = ETraceableMessages.VALIDATION_PRODUIT_GENERIQUE, hasReturnedValue=Traceable.HAS_NOT_RETURNS_VALUE)
public void valider(ElementNiveauUn element) {
// TODO: implement
}
}
你的方面应该是这样的:
package fr.generali.nova.atp.logging.advisor;
@Aspect
public class TraceableAdvisor {
@Before(value = "execution(* fr.generali.nova.atp.service.metier.api.*.*(..)) && @annotation(traceable) && args(element)", argNames = "element,traceable")
public void traceWhenReturnedValueDoesntExistOrNotNecessary(ElementNiveauUn element, Traceable traceable) {
// TODO: implement
System.err.println("traced...");
}
}
对Spring AOP默认代理策略是JDK基于接口的代理,所以你的切入点表达式应该匹配接口方法执行,而不是实现方法执行,和你的poincut表达式可以匹配任何一种接口评判执行或实施方法执行。
并记住在您的配置中包含AspectJAutoProxyCreator
,例如使用<aspectj-autoproxy />
标记。
这里是一个简单的测试,以证明everyting工作:
public class TraceableAdvisorTest {
@Configuration
public static class TestConfiguration {
@Bean
public IProduitGeneriqueService produitGeneriqueService() {
return new DefaultProduitGeneriqueServiceImpl();
}
@Bean
public TraceableAdvisor traceableAdvisor() {
return new TraceableAdvisor();
}
@Bean
public AnnotationAwareAspectJAutoProxyCreator autoProxyCreator() {
return new AnnotationAwareAspectJAutoProxyCreator();
}
}
private AnnotationConfigApplicationContext testApplicationContext;
@Test
public void testTraceWhenReturnedValueDoesntExistOrNotNecessary() {
this.testApplicationContext = new AnnotationConfigApplicationContext();
this.testApplicationContext.register(TestConfiguration.class);
this.testApplicationContext.refresh();
IProduitGeneriqueService service = BeanFactoryUtils.beanOfType(this.testApplicationContext, IProduitGeneriqueService.class);
System.err.println("BEFORE");
service.valider(null);
System.err.println("AFTER");
}
}
的err
输出是:
BEFORE
traced...
AFTER
对于所有组合:
fr.generali.nova.atp.service.metier.api.*.*(..)
fr.generali.nova.atp.service.metier.impl.*.*(..)
fr.generali.nova.atp.service.metier..*.*(..)
是'DefaultProduitGeneriqueService'一个Spring bean? Spring AOP只能应用于bean。 – 2011-05-04 18:28:45
DefaultProduitGeneriqueService是一个bean – leplusfaible 2011-05-05 13:42:46