views:

37

answers:

2

Hello,

I'm reading Spring in Action and I'm trying to set an aop example.

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

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

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

The output is as follow :

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

File knight.xml :

The minstrel code is not invoked.

Thanks.

A: 

Sorry,

file 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>
christophe
A: 

I see two problems here:
1. Your logs contain ClassNotFoundException for classes org.apache.commons.collections.map.LinkedMap and edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap wich is quite strange, because your code doesn't mention none of these classes, and Spring, as far as I know, also doesn't use them. To fix this exeptions, you need to add Apache common-collections.jar and backport-util-concurrent.jar libraries to your classpath.

2. You use BeanFactory implementation instead of ApplicationContext implementation. According to Spring documentation BeanFactory implementations by default doesn't support AOP. Here is quote from there:
A BeanFactory pretty much just instantiates and configures beans. An ApplicationContext also does that, and it provides the supporting infrastructure to enable lots of enterprise-specific features such as transactions and AOP.

wax