在我的Spring 4应用程序中,我有一个这样的类:
class Address {
public getAdress(){
...
List<Town> towns = getTowns();
...
}
@CustomAnnotation
private List<Town> getTowns(){
}
}
使用AspectJ,我可以轻松拦截getAdress()
电话。
问题在于getTowns()
未被截获。
有一些解决方案,如加载时编织,但很难调整,我不知道重新配置我的应用程序。
如何在没有AspectJ的情况下捕获对使用CustomAnnotation
注释的任何方法的任何调用?
此致
PS:我知道there is a workaround with self-reference,但我发现它并非常清洁&#34;。
答案 0 :(得分:0)
提取界面:
interface TempIfc{
public getAdress();
}
class Address implements TempIfc{
@Override
public getAdress(){
...
List<Town> towns = getTowns();
...
}
@CustomAnnotation
private List<Town> getTowns(){
}
}
添加配置:
<bean id="tgt" class="Address">
<!-- your bean properties here -->
</bean>
<bean id="proxified" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="TempIfc"/>
<property name="target" ref="tgt"/>
<property name="interceptorNames">
<list>
<value>myInterceptor</value>
</list>
</property>
</bean>
<bean id="myInterceptor" class="MyMethodInterceptor"/>
<!-- Example of usage with some service -->
<bean id="someYourService" class="Service">
<property name="adress" ref="proxified" />
</bean>
最后是拦截器:
public class MyMethodInterceptor implements org.aopalliance.intercept.MethodInterceptor{
public Object invoke(org.aopalliance.intercept.MethodInvocation invocation){
System.out.println("Before calling any TempIfc method ");
// Actionally, you may use getMethod, getArguments here to explore details, or modify arguments
Object result = invocation.proceed(); //also it is not obligatory to call real method
System.out.println("After calling any TempIfc method ");
//you may modify result of invocation here
return result;
}
}
答案 1 :(得分:0)
我认为我们可以使用Spring提供的ControlFlowPointcut。
ControlFlowPointcut会查看stacktrace并仅在它在stacktrace中找到特定方法时才与切入点匹配。本质上,切入点只有在特定上下文中调用方法时才匹配。
在这种情况下,我们可以像
一样创建切入点。unpack requires a bytes object of length 13
现在,使用ProxyFactory在MyClass实例上创建一个代理,然后调用method1()。
在上述情况下,仅建议使用method2(),因为它是从method1()调用的。