假設服務接口在包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