Spring 仅子类方法的 AOP 切入点表达式
Spring AOP pointcut expression for Subclass only method
我有一个场景需要拦截一些子class方法,但是我找不到合适的切入点表达式来做到这一点。
我有一个面向客户端的接口 InfoService
,它有一个方法 getClientDetails
。
package sample;
public interface InfoService {
InfoVO getClientDetails(int id);
}
实现 class 有一些嵌套方法,如 get*Info()
。
package sample;
public class InfoServiceImpl implements InfoService{
public InfoVO getClientDetails(int id) {
InfoVO clientInfo = new InfoVO();
clientInfo.setA(getAInfo(id));
clientInfo.setB(getBInfo(id));
clientInfo.setC(getCInfo(id));
return clientInfo;
}
public Object getAInfo(int id) {
return null;
}
public Object getBInfo(int id) {
return null;
}
public Object getCInfo(int id) {
return null;
}
}
当用户调用 getClientDetails
方法时,我想拦截 get*Info()
方法。我可以很容易地拦截 getClientDetails
但似乎没有什么可以拦截 subclass 方法。我什至尝试使用自定义注释来注释这些信息方法,但没有成功。到目前为止,我想出了以下方面
<aop:aspect ref="infoAspect">
<aop:pointcut expression="execution(* sample.InfoService+.*Info(..))"
id="infoMethods" />
<aop:around method="aroundAdviceForinfoMethods" pointcut-ref="infoMethods" />
</aop:aspect>
将 <aop:aspectj-autoproxy proxy-target-class="false"/>
设置为 true 或 false 也没有帮助。
我知道 AOP 无法拦截私有 subclass 方法,但这些是 public 方法。甚至可以这样做吗?非常感谢任何帮助。
PS:显示的示例用于演示目的。实际的实现是巨大的,所以将这些内部方法移动到不同的 bean 并调用是不可行的。
这是一个经典的问题,已经在这里被问过几十次了。我猜你还没有阅读 Spring 手册中关于 Spring AOP 是基于代理的信息,因此 Spring 方面 cannot intercept self-invocation. If you really need AOP to work for self-invoked methods (even private ones if necessary), say goodbye to Spring AOP and hello to full AspectJ and LTW(加载时织入)。
我有一个场景需要拦截一些子class方法,但是我找不到合适的切入点表达式来做到这一点。
我有一个面向客户端的接口 InfoService
,它有一个方法 getClientDetails
。
package sample;
public interface InfoService {
InfoVO getClientDetails(int id);
}
实现 class 有一些嵌套方法,如 get*Info()
。
package sample;
public class InfoServiceImpl implements InfoService{
public InfoVO getClientDetails(int id) {
InfoVO clientInfo = new InfoVO();
clientInfo.setA(getAInfo(id));
clientInfo.setB(getBInfo(id));
clientInfo.setC(getCInfo(id));
return clientInfo;
}
public Object getAInfo(int id) {
return null;
}
public Object getBInfo(int id) {
return null;
}
public Object getCInfo(int id) {
return null;
}
}
当用户调用 getClientDetails
方法时,我想拦截 get*Info()
方法。我可以很容易地拦截 getClientDetails
但似乎没有什么可以拦截 subclass 方法。我什至尝试使用自定义注释来注释这些信息方法,但没有成功。到目前为止,我想出了以下方面
<aop:aspect ref="infoAspect">
<aop:pointcut expression="execution(* sample.InfoService+.*Info(..))"
id="infoMethods" />
<aop:around method="aroundAdviceForinfoMethods" pointcut-ref="infoMethods" />
</aop:aspect>
将 <aop:aspectj-autoproxy proxy-target-class="false"/>
设置为 true 或 false 也没有帮助。
我知道 AOP 无法拦截私有 subclass 方法,但这些是 public 方法。甚至可以这样做吗?非常感谢任何帮助。
PS:显示的示例用于演示目的。实际的实现是巨大的,所以将这些内部方法移动到不同的 bean 并调用是不可行的。
这是一个经典的问题,已经在这里被问过几十次了。我猜你还没有阅读 Spring 手册中关于 Spring AOP 是基于代理的信息,因此 Spring 方面 cannot intercept self-invocation. If you really need AOP to work for self-invoked methods (even private ones if necessary), say goodbye to Spring AOP and hello to full AspectJ and LTW(加载时织入)。