2010-07-30 4 views
0

Я читаю Spring in Action, и я пытаюсь установить пример aop.Нет выхода aop с использованием spring aop 2.0

package com.springinaction.chapter01.knight; 
import org.springframework.beans.factory.BeanFactory; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
import org.springframework.core.io.FileSystemResource; 

public class KnightApp { 
    public static void main(String[] args) throws Exception { 
     BeanFactory factory = new XmlBeanFactory(new FileSystemResource("knight.xml")); 
     Knight knight = (Knight) factory.getBean("knight"); 
     knight.embarkOnQuest(); 
    } 
} 

Файл KnightOfTheRoundTable.java:

package com.springinaction.chapter01.knight; 

public class KnightOfTheRoundTable implements Knight { 
    private String name; 
    private Quest quest; 

    public KnightOfTheRoundTable(String name) { 
     this.name = name; 
    } 

    public Object embarkOnQuest() throws QuestFailedException { 
     //minstrel.singBefore(this); 
     HolyGrail grail = (HolyGrail) quest.embark(); 
     //minstrel.singAfter(this); 
     return grail; 
    } 

    public void setQuest(Quest quest) { 
     this.quest = quest; 
    } 

    @Override 
    public String getName() { 
     // TODO Auto-generated method stub 
     return name; 
    } 
} 

Файл Minstrel.java:

package com.springinaction.chapter01.knight; 

import org.apache.log4j.Logger; 

public class Minstrel { 
    private static final Logger SONG = Logger.getLogger(Minstrel.class); 

    public void singBefore(Knight knight) { 
     SONG.info("Fa la la; Sir " + knight.getName() + " is so brave!"); 
     System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); 
    } 

    public void singAfter(Knight knight) { 
     SONG.info("Tee-hee-he; Sir " + knight.getName() 
       + " did embark on a quest!"); 
    } 
} 

Выход следующим образом: knight.xml

DEBUG ClassUtils - Class [org.apache.commons.collections.map.LinkedMap] or one of its dependencies is not present: java.lang.ClassNotFoundException: org.apache.commons.collections.map.LinkedMap 
DEBUG ClassUtils - Class [edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap] or one of its dependencies is not present: java.lang.ClassNotFoundException: edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap 
INFO XmlBeanDefinitionReader - Loading XML bean definitions from file [C:\Users\Chris\workspace\chapter01\knight.xml] 
DEBUG DefaultDocumentLoader - Using JAXP provider [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl] 
DEBUG PluggableSchemaResolver - Loading schema mappings from [META-INF/spring.schemas] 
DEBUG PluggableSchemaResolver - Found XML schema [http://www.springframework.org/schema/aop/spring-aop-2.0.xsd] in classpath: org/springframework/aop/config/spring-aop-2.0.xsd 
DEBUG DefaultBeanDefinitionDocumentReader - Loading bean definitions 
DEBUG XmlBeanFactory - Creating shared instance of singleton bean 'knight' 
DEBUG XmlBeanFactory - Creating instance of bean 'knight' with merged definition [Root bean: class [com.springinaction.chapter01.knight.KnightOfTheRoundTable]; scope=singleton; abstract=false; lazyInit=false; autowireCandidate=true; autowireMode=0; dependencyCheck=0; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\Users\Chris\workspace\chapter01\knight.xml]] 
DEBUG XmlBeanFactory - Eagerly caching bean 'knight' to allow for resolving potential circular references 
DEBUG XmlBeanFactory - Creating shared instance of singleton bean 'quest' 
DEBUG XmlBeanFactory - Creating instance of bean 'quest' with merged definition [Root bean: class [com.springinaction.chapter01.knight.HolyGrailQuest]; scope=singleton; abstract=false; lazyInit=false; autowireCandidate=true; autowireMode=0; dependencyCheck=0; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\Users\Chris\workspace\chapter01\knight.xml]] 
DEBUG XmlBeanFactory - Eagerly caching bean 'quest' to allow for resolving potential circular references 

файла :

<bean id="minstrel" class="com.springinaction.chapter01.knight.Minstrel" /> 
<aop:config> 
    <aop:aspect ref="minstrel"> 
     <aop:pointcut id="questPointcut" 
      expression="execution(* *.embarkOnQuest(..)) and target(bean)" /> 
     <aop:before method="singBefore" pointcut-ref="questPointcut" 
      arg-names="bean" /> 
     <aop:after-returning method="singAfter" 
      pointcut-ref="questPointcut" arg-names="bean" /> 
    </aop:aspect> 
</aop:config> 
<bean id="quest" class="com.springinaction.chapter01.knight.HolyGrailQuest" /> 
<bean id="knight" 
    class="com.springinaction.chapter01.knight.KnightOfTheRoundTable"> 
    <constructor-arg value="Bedivere" /> 
    <property name="quest" ref="quest" /> 
</bean> 

Код minstrel не вызывается.

Спасибо.

+1

Прежде всего, ваш пример неполный. Я не вижу никаких определений интерфейса «Knight» и «Quest». Я мог догадаться, конечно, но все же. То, как вы отформатировали свой вопрос, также не помогает понять проблему. – wax

ответ

0

К сожалению,

файл knight.xml:

<bean id="minstrel" class="com.springinaction.chapter01.knight.Minstrel" /> 
<aop:config> 
    <aop:aspect ref="minstrel"> 
     <aop:pointcut id="questPointcut" 
      expression="execution(* *.embarkOnQuest(..)) and target(bean)" /> 
     <aop:before method="singBefore" pointcut-ref="questPointcut" 
      arg-names="bean" /> 
     <aop:after-returning method="singAfter" 
      pointcut-ref="questPointcut" arg-names="bean" /> 
    </aop:aspect> 
</aop:config> 
<bean id="quest" class="com.springinaction.chapter01.knight.HolyGrailQuest" /> 
<bean id="knight" 
    class="com.springinaction.chapter01.knight.KnightOfTheRoundTable"> 
    <constructor-arg value="Bedivere" /> 
    <property name="quest" ref="quest" /> 
</bean> 
0

Я вижу две проблемы здесь:
1. Ваши журналы содержат ClassNotFoundException для классов org.apache.commons.collections.map.LinkedMap и edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap Wich довольно странно, потому что ваш код Безразлично Я не упоминаю ни один из этих классов, и весна, насколько я знаю, также не использует их. Чтобы исправить это исключение, вам нужно добавить библиотеки Apache common-collections.jar и backport-util-concurrent.jar в ваш путь к классам.

2. Вы используете BeanFactory вместо ApplicationContext. Согласно документации Spring, реализация BeanFactory по умолчанию не поддерживает AOP. Вот цитата оттуда:
BeanFactory в значительной степени просто создает и настраивает бобы. ApplicationContext также делает это и предоставляет поддерживающую инфраструктуру для обеспечения множества специфических для предприятия функций, таких как транзакции и АОП.

0

У меня также была такая же проблема, читая о Spring AOP. Затем я добавил зависимость в моем pom.xml (я использовал spring with maven), а затем начал работать.

<dependency> 
<groupId>aspectj</groupId> 
<artifactId>aspectjweaver</artifactId> 
<version>1.5.4</version> 
<scope>compile</scope> 
</dependency> 

Примечание: Для загрузки весеннего конфигурационного файла я использовал следующий код.

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");