2017-03-13 3 views
0

In meiner Spring 4 Anwendung habe ich eine Klasse wie folgt:Spring: Interception ohne AspectJ

class Address { 

    public getAdress(){ 
     ... 
     List<Town> towns = getTowns(); 
     ... 
    } 

    @CustomAnnotation 
    private List<Town> getTowns(){ 

    } 
} 

Mit AspectJ kann ich leicht abfangen der getAdress() Anruf. Das Problem ist mit getTowns(), die nicht abgefangen wird.

Es gibt Lösungen wie Load-Time Weben, aber das ist schwierig zu tunen und ich nicht was meine Anwendung neu zu konfigurieren.

Wie kann ich jeden Anruf erfassen, der mit einer Methode gemacht wurde, die mit CustomAnnotation ohne AspectJ kommentiert wurde?

Grüße

PS: Ich weiß, dass there is a workaround with self-reference aber ich es „sauber“ sehr nicht finden.

+0

Extrahieren Sie eine Schnittstelle mit 'getAdress', und erstellen Sie einen Proxy mit [ProxyFactoryBean] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/aop/framework/ProxyFactoryBean.html). Dann benutze den Proxy anstelle der Bean – Eugene

+0

@Eugene Danke für deinen Kommentar. Könnten Sie bitte Ihre Idee durch einen Code veranschaulichen? Ist Ihre Methode "XML-frei", weil meine App keine XML-Konfigurationsdatei hat und ich XML so weit wie möglich vermeiden möchte. – Dinlike

+2

Sie können einfach nicht das ist die Beschränkung der Proxy-basierte AOP, die einzige Problemumgehung ist Selbstaufruf, die Sie nicht wollen (was im Grunde die einzige Lösung ist). Abgesehen von Ladezeit oder Kompilierzeit gibt es keine anderen Lösungen. –

Antwort

0

Extrahierung Schnittstelle:

interface TempIfc{ 
    public getAdress(); 
} 

class Address implements TempIfc{ 

    @Override 
    public getAdress(){ 
     ... 
     List<Town> towns = getTowns(); 
     ... 
    } 

    @CustomAnnotation 
    private List<Town> getTowns(){ 

    } 
} 

Hinzufügen config:

<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> 

Und schließlich Interceptor:

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

Hier ist die docs und javadocs über ProxyFactoryBean.

+0

Das wird immer noch nicht funktionieren. Es ist immer noch ein Proxy und wird interne Methodenaufrufe nur abfangen, wenn Sie einen Selbstaufruf durchführen. –

Verwandte Themen