2010-12-06 5 views
0

Мой код: -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. Может ли какой-нибудь орган рассказать мне, что происходит, и как заставить его вызвать метод invoke?

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

$ Proxy4 15,5

Спасибо, Маноджа

ответ

0

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

+0

Я использую Spring3, я хочу иметь контроль над фактическим экземпляром, который будет вызываться в методе вызова Around invice, вот почему я использую этот старый стиль. В LoggingAroundAdvice я проверяю, какая реализация должна использоваться в зависимости от флага useStub. Но я не знаю, почему Spring не вызывает метод invoke()? – Manoj

+0

Не можете ли вы получить это из ProceedingJoinPoint, используя метод getTarget. – lalit

+0

Также, если вы можете сказать, что вы пытаетесь сделать, это поможет лучше ответить на него. Я не уверен в том, почему вы хотите получить совет, передав как заглушку, так и фактический калькулятор в конструкторе рекомендаций. Кроме того, ваша тестовая служба находится в той же конфигурации XML, которая звучит как анти-шаблон для меня. Если вы сделали это только для показа цели, чем это хорошо. – lalit

Смежные вопросы