简体   繁体   English

使用Spring AOP 2.0没有AOP输出

[英]No aop output using spring aop 2.0

I'm reading Spring in Action and I'm trying to set an aop example. 我正在阅读Spring in Action,并尝试设置一个aop示例。

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

The file KnightOfTheRoundTable.java: 文件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;
    }
}

The file Minstrel.java: 文件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!");
    }
}

The output is as follows : 输出如下:

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 : 文件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>

The minstrel code is not invoked. Minstrel代码不会被调用。

Thanks. 谢谢。

Sorry, 抱歉,

file knight.xml : 文件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>

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. 1.您的日志包含类org.apache.commons.collections.map.LinkedMapedu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap ClassNotFoundException ,这很奇怪,因为您的代码未提及这些内容据我所知,Spring类也没有使用它们。 To fix this exeptions, you need to add Apache common-collections.jar and backport-util-concurrent.jar libraries to your classpath. 要解决此问题,您需要将Apache common-collections.jarbackport-util-concurrent.jar库添加到类路径。

2. You use BeanFactory implementation instead of ApplicationContext implementation. 2.您使用BeanFactory实现而不是ApplicationContext实现。 According to Spring documentation BeanFactory implementations by default doesn't support AOP. 根据Spring文档,默认情况下,BeanFactory实现不支持AOP。 Here is quote from there: 这是那里的报价:
A BeanFactory pretty much just instantiates and configures beans. BeanFactory几乎只是实例化并配置Bean。 An ApplicationContext also does that, and it provides the supporting infrastructure to enable lots of enterprise-specific features such as transactions and AOP. ApplicationContext也可以做到这一点,它提供了支持基础结构,以启用许多特定于企业的功能,例如事务和AOP。

I also had the same problem while reading about Spring AOP. 在阅读有关Spring AOP时,我也遇到了同样的问题。 Then I added the dependency in my pom.xml (I used spring with maven) and then it started working. 然后,我在pom.xml中添加了依赖项(我将spring与maven一起使用),然后它开始工作。

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

Note: I used following code for loading spring configuration file. 注意:我使用以下代码来加载spring配置文件。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM