我正在尝试拦截对实体管理器中查找方法的调用。
public Map<String, String> get() {
Map<String, String> map = new HashMap<>();
DleTestData data = em.find(DleTestData.class, "1");
map.put(data.getId(), data.getName() + " : " + data.getRegion());
return map;
}
我有一个这样的建议:
@Aspect
@Configuration
public class MyAdvice {
@Around("execution(* javax.persistence.EntityManager.*(..))")
public Object aroundFind(ProceedingJoinPoint joinPoint) {
System.err.println("before em find called : " + joinPoint);
Object o = null;
try {
o = joinPoint.proceed();
System.err.println("after em find advice called : " + joinPoint);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return o;
}
}
输出显示截获的调用,但查找方法在切入点中不匹配。 你能建议我在这里做错了什么吗?
输出:
在em之前找到调用:执行(元模型) javax.persistence.EntityManager.getMetamodel()) after em find advice 调用:执行(元模型) javax.persistence.EntityManager.getMetamodel())
Spring AOP手册指出 Spring AOP 仅适用于 Spring bean/组件。
同一手册还描述了如何通过LTW(加载时编织)通过完整的AspectJ将AOP应用于非弹簧类。它很容易配置。
如果您在从javax..*
包编织到基本类时遇到任何问题,因为该类可能在激活 LTW 之前加载(即使您使用javaagent:/path/to/aspectjweaver.jar
应该能够做到这一点),您仍然可以从execution()
切换到call()
切入点。只要调用在您自己的应用程序代码中,就应该很容易通过 AspectJ 进行拦截。但是你确实需要 AspectJ,而不是 Spring AOP,因为后者既不支持非 Spring bean(如上所述),也不call()
切入点(如 Spring 手册中所述)。
OP评论后更新:
我刚刚为您检查了 JavadocEntityManager
:方法getMetaModel()
是接口的一部分,而get()
不是。因此,切入点找不到它。