尝试使用aspectJ从Spring Data JPA存储库建议方法

时间:2012-10-08 09:57:01

标签: spring aop aspectj spring-aop spring-data-jpa

我正在尝试定义一个切入点,当调用Spring Data JPA存储库中的方法时,该切入点会运行。

这是我的匿名切入点以及内联通知(来自PliEventManagerAspect):

after(Pli pli) returning: (execution(* org.springframework.data.repository.CrudRepository+.save(Pli)) && args(pli)){
    System.out.println("Caught!!!!");   
}

这里是我的PliRepository的定义:

public interface PliRepository extends GlobalRepository<Pli, Long>, PliRepositoryCustom {

和PliRepositoryImpl:

public class PliRepositoryImpl extends QueryDslRepositorySupport implements PliRepositoryCustom {

和PliRepositoryCustom:

public interface PliRepositoryCustom {

最后是GlobalRepository:

@NoRepositoryBean
public interface GlobalRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

我还设置了javaagent命令行arg。我有以下aop.xml:

<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN"
"http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options="-verbose">
        <include within="org.springframework.data.repository..*"/>
    </weaver>
    <aspects>
        <aspect name="trc.suivi.aspects.PliEventManagerAspect" />
    </aspects>
</aspectj>

上面的建议,应该在LTW中运行,因为它是在一个jar中建议一个类,但根本没有运行......我确信我必须在切入点定义中犯一些错误。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我改为以下配置:

<强> aop.xml文件:

<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN"
"http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options="-verbose"></weaver>
    <aspects>
        <aspect name="trc.suivi.aspects.PliEventManagerAspect" />
    </aspects>
</aspectj>

因此,编织者扫描所有类。

PliEventManagerAspect.aj:

after(Pli pli) returning: (execution(* org.springframework.data.repository.CrudRepository+.save(*)) && args(pli)){
        log.debug("Caught!!!!");  
    }

它现在有效(感谢Spring论坛的Marten)。