2010-12-06 3 views
0

Mein Code: -Frühling AOP-Proxy

<context:annotation-config/> 
    <bean id="arthmeticCalculator" class="com.manoj.aop.test.CalculatorImpl" lazy-init="true"/> 
    <bean id="stubCalculator" class="com.manoj.aop.test.StubCalculator" lazy-init="true"/> 
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
     <property name="beanNames"> 
     <list> 
      <value>*Calculator</value> 
     </list> 
     </property> 
     <property name="interceptorNames"> 
     <list> 
      <value>methodNameAdvisor</value> 
     </list> 
     </property> 
    </bean> 
    <bean id="methodNameAdvisor" 
     class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> 
    <property name="mappedNames"> 
     <list> 
     <value>add</value> 
     <value>sub</value> 
     </list> 
    </property> 
    <property name="advice" ref="loggingAroundAdvice" /> 
    </bean> 
    <bean id="loggingAroundAdvice" class="com.manoj.aop.test.LoggingAroundAdvice"> 
     <constructor-arg><ref bean="arthmeticCalculator"/></constructor-arg> 
     <constructor-arg><ref bean="stubCalculator"/></constructor-arg> 
     <constructor-arg><value>false</value></constructor-arg> 
    </bean> 
    <bean id="testService" class="com.manoj.aop.test.TestService"> 
    <!-- 
     <property name="arthmeticCalculator" ref="arthmeticCalculator"/> 
    --> 
    </bean> 

Java-Code:

package com.manoj.aop.test; 

import org.aopalliance.intercept.MethodInterceptor; 
import org.aopalliance.intercept.MethodInvocation; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.beans.factory.annotation.Value; 

public class LoggingAroundAdvice implements MethodInterceptor{ 


     Calculator actualCalculator; 
     Calculator stubCalculator; 
     boolean useStub; 



public LoggingAroundAdvice(Calculator actualCalculator, Calculator stubCalculator, boolean useStub) { 
    this.actualCalculator = actualCalculator; 
    this.stubCalculator = stubCalculator; 
    this.useStub = useStub; 
    } 



public Object invoke(MethodInvocation methodInvocation) throws Throwable { 
    System.out.println("Around Invoice called"); 
    Calculator calc = useStub ? stubCalculator: actualCalculator; 
    System.out.println(calc.getClass().getName()); 
    Object result = methodInvocation.getMethod().invoke(calc, methodInvocation.getArguments()); 
    return result; 
} 

} 

import org.springframework.beans.factory.annotation.Autowired; 

public class TestService { 

@Autowired 
    private Calculator arthmeticCalculator; 


    public void test(){ 
     System.out.println(arthmeticCalculator.getClass().getName()); 
     System.out.println(arthmeticCalculator.add(5, 10.5)); 
    } 



} 

Sorry Leute ich weiß nicht, wie Text in diesem Editor zu formatieren, Mein Problem ist: -

Spring erstellt einen Proxy für die Klasse, führt jedoch niemals die Invoke-Methode des Around-Hinweises aus. Kann mir ein Körper bitte sagen, was los ist und wie man die Aufrufmethode aufruft? Hier

ist der Ausgang der Testklasse: -

$ Proxy4 15.5

Danke, Manoj

Antwort

0

Welche Version von Spring verwenden Sie? Die Art und Weise, wie Sie Proxy machen, ist der ältere Weg. Der bessere Weg ist die Annotation oder der reine POJO + XML-Weg. Sie können eine kurze Einführung in AOP Abschnitt here

+0

Ich benutze Spring3 ,, Ich möchte die Kontrolle über die tatsächliche Instanz, die in der Aufrufmethode des Around invice aufgerufen werden, deshalb verwende ich diesen alten Stil. In LoggingAroundAdvice prüfe ich, welche Implementierung abhängig von der useStub-Flag verwendet werden soll. Aber ich weiß nicht, warum Spring nicht die invoke() -Methode aufruft. – Manoj

+0

Können Sie dies nicht von ProceedingJoinPoint mit der getTarget-Methode erhalten. – lalit

+0

Auch wenn Sie sagen können, was Sie versuchen, wird es helfen, es besser zu beantworten. Ich bin mir nicht sicher, warum Sie einen Rat geben möchten, indem Sie sowohl den Stub als auch den tatsächlichen Rechner im Beratungskonstruktor übergeben. Auch dein Testservice sitzt in der gleichen XML-Konfiguration, die für mich wie ein Anti-Pattern klingt. Wenn Sie es nur zum Zweck der Veranschaulichung getan haben, dann ist es in Ordnung. – lalit