Spring:没有AspectJ的拦截

时间:2017-03-13 23:02:07

标签: java spring spring-mvc aop aspectj

在我的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;。

2 个答案:

答案 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;
    }
}

以下是关于ProxyFactoryBean的docsjavadocs

答案 1 :(得分:0)

我认为我们可以使用Spring提供的ControlFlowPointcut。

ControlFlowPointcut会查看stacktrace并仅在它在stacktrace中找到特定方法时才与切入点匹配。本质上,切入点只有在特定上下文中调用方法时才匹配。

在这种情况下,我们可以像

一样创建切入点。
unpack requires a bytes object of length 13

现在,使用ProxyFactory在MyClass实例上创建一个代理,然后调用method1()。

在上述情况下,仅建议使用method2(),因为它是从method1()调用的。