AOP Spring在建议不工作之前

时间:2011-05-04 17:53:02

标签: spring aop

方法defaultWroduitGeneriqueService.valider没有被方法traceWhenReturnedValueDoesntExistOrNotNecessary捕获,我不明白为什么?

package fr.generali.nova.atp.service.metier.impl;

public class DefaultProduitGeneriqueService extends DefaultService implements IProduitGeneriqueService, IBacAware {

...

@Override
@Traceable(value = ETraceableMessages.VALIDATION_PRODUIT_GENERIQUE, hasReturnedValue=Traceable.HAS_NOT_RETURNS_VALUE)
public void valider(ElementNiveauUn element) {
   ...
}
...
}

package fr.generali.nova.atp.logging.advisor;


@Aspect
public class TraceableAdvisor {

    @Before(value = "execution(* fr.generali.nova.atp.service.metier.impl.*.*(..)) && @annotation(traceable) && args(element)", argNames = "element,traceable")
    public void traceWhenReturnedValueDoesntExistOrNotNecessary(ElementNiveauUn element, Traceable traceable) {
       ...
    }

}

2 个答案:

答案 0 :(得分:0)

确保通过注释或appCtx

正确配置两个bean

看起来你的Aspect绝对是正确的,但另一个类怎么样?是否启用了Spring?

此外,如果两个类确实配置正确,您确定传递的实例是Spring bean而不是构造函数中的“new”实例吗?

答案 1 :(得分:0)

假设服务接口位于包 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表达式可以匹配接口mothod执行或实现方法执行。

请务必使用AspectJAutoProxyCreator标记在您的配置中添加<aspectj-autoproxy />

这是一个简单的测试,以证明每一个工作:

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..*.*(..)