[英]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.LinkedMap
和edu.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.jar
和backport-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.