2009-11-04 4 views
0

Мне нужна помощь в создании АОП. Что мне здесь не хватает?My Spring AOP не работает

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 

    <bean id="duke" class="com.tutorial.springidol.Singer"> 
     <constructor-arg value="Duke"/> 
     <constructor-arg> 
     <bean class="com.tutorial.springidol.Song"> 
      <property name="title" value="ABC"/> 
    </bean>   
     </constructor-arg> 
    </bean> 

    <bean id="audienceAdvice" class="com.tutorial.advice.AudienceAdvice"> 
    <property name="audience"> 
     <bean class="com.tutorial.springidol.Audience"/> 
    </property> 
    </bean> 

    <bean id="audienceAdvisor" 
     class="org.springframework. 
     aop.support.RegexpMethodPointcutAdvisor"> 

     <property name="advice" ref="audienceAdvice"/> 
     <property name="pattern" value=".*perform"/> 
    </bean> 
</beans> 

AudienceAdvice.java

public class AudienceAdvice implements MethodBeforeAdvice, 
        AfterReturningAdvice { 
    @Override 
    public void before(Method arg0, Object[] arg1, Object arg2) 
      throws Throwable { 
     audience.takeSeats(); 
     audience.turnOffCellphones(); 
    } 

    @Override 
    public void afterReturning(Object arg0, Method arg1, Object[] arg2, 
      Object arg3) throws Throwable { 
     audience.applaud(); 
    } 
    private Audience audience; 
    public void setAudience(Audience audience) { 
     this.audience = audience; 
    } 
} 

АОП не работает, но цель выполняется, хотя.

ответ

0

Вы указали целевой компонент и совет, но по умолчанию Spring не знает, как применить совет к цели.

Вам необходимо запустить автопрокси.

Один из способов сделать это:.

<!-- Autoproxy --> 
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="beanNames"> 
     <list> 
      <value>duke</value>    
     </list> 
    </property> 

    <property name="interceptorNames"> 
     <list> 
      <value>audienceAdvisor</value> 
     </list> 
    </property> 
</bean> 
+0

(Я должен также сказать, что это нечетный боб в том, что вам не нужно искать его или провод его в любой другой боб при запуске контейнер, фасоль загорается и добавляет рекомендации ко всем соответствующим именам бобов). Просто добавьте это в свой XML и до тех пор, пока вы обращаетесь к своему компоненту в том, как описывает инструментарий, он должен работать. –

+0

Это сработало! Но все это время я думал, что советник аудитории использовал этот совет, поскольку он имел совет (свойство совета), и он знал, когда его применять (свойство шаблона). – Jeune

+0

Свойство pattern в Advisor описывает методы, к которым применяются, а не к компонентам, к которым нужно применить. Я считаю, что это сбивает с толку - я настоятельно рекомендую вам исследовать пространство имен aop: namespace, это позволяет настраивать более интуитивно понятным способом. Кроме того, посмотрите на синтаксис AspectJ Pointcut. Обе темы описаны в справочном руководстве. –

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