Прокси-сервер Spring AOP

Мой код: -

<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-код:

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



}

Извините, ребята, я не знаю, как форматировать текст в этом редакторе. Моя проблема: -

Spring создает прокси для класса, но никогда не выполняет метод Invoke совета Around. Может ли кто-нибудь сказать мне, что происходит и как заставить его вызывать метод вызова?

Вот вывод тестового класса: -

$Прокси4 15,5

Спасибо, Маной


person Manoj    schedule 06.12.2010    source источник


Ответы (1)


Какую версию Spring вы используете? То, как вы делаете прокси, является старым способом. Лучше использовать аннотацию или чистый способ POJO+XML. Вы можете ознакомиться с кратким введением в раздел АОП здесь

person lalit    schedule 06.12.2010
comment
Я использую Spring3, я хочу иметь контроль над фактическим экземпляром, который будет вызываться в методе вызова команды Around, поэтому я использую этот старый стиль. В LoggingAroundAdvice я проверяю, какую реализацию следует использовать в зависимости от флага useStub. Но я не знаю, почему Spring не вызывает метод invoke ()? - person Manoj; 06.12.2010
comment
Вы не можете получить это от ProceedingJoinPoint, используя метод getTarget. - person lalit; 06.12.2010
comment
Кроме того, если вы можете сказать, что вы пытаетесь сделать, это поможет лучше ответить на него. Я не уверен, почему вы хотите дать совет, передав как заглушку, так и фактический калькулятор в конструкторе советов. Кроме того, ваш тестовый сервис находится в том же XML конфигурации, что для меня звучит как анти-шаблон. Если вы сделали это только для демонстрации, то это нормально. - person lalit; 06.12.2010
comment
ну, в моем приложении некоторые сервисы еще не реализованы. эти сервисы обращаются к серверным системам, чтобы получить данные и в конечном итоге вернуть мне VO. Теперь эти системы являются сторонними системами, которые еще не готовы предоставить нам фактические данные. поэтому я пытаюсь заглушить эти службы с помощью АОП. Так что, когда я вызываю службу из своего кода, я получаю некоторые заглушенные данные, и это решение принимается флагом «isStub», который можно поместить в файл свойств. Но проблема в том, что метод вызова никогда не вызывается. что-то серьезно не так с кодом, который я написал, и я не могу это выяснить. - person Manoj; 06.12.2010