我嘗試在Spring中創建一個簡單的AOP示例。但是,我得到AOP錯誤。Spring AOP程序 - 實例化失敗
Knight.java
package com.springinaction.knights;
public abstract class Knight {
public abstract void embarkQuest() ;
}
DragonSlayingKnights.java
package com.springinaction.knights;
public class DragonSlayingKnights extends Knight {
Quest quest;
public DragonSlayingKnights(Quest quest){
this.quest = quest ;
}
@Override
public void embarkQuest() {
quest.embark();
}
}
FightingKnight.java
package com.springinaction.knights;
public class FightingKnight extends Knight {
Quest quest ;
public FightingKnight(Quest quest){
this.quest = quest;
}
@Override
public void embarkQuest() {
quest.embark();
}
}
Quest.java
package com.springinaction.knights;
public abstract class Quest {
public abstract void embark();
}
DragonSlayingQuest.java
package com.springinaction.knights;
public class DragonSlayingQuest extends Quest {
@Override
public void embark() {
System.out.println("I am on a Dragon Slaying Quest");
}
}
FightingQuest.java
package com.springinaction.knights;
public class FightingQuest extends Quest {
@Override
public void embark() {
System.out.println("I am on a Fighting Quest");
}
}
Minstrel.java
package com.springinaction.knights;
public class Minstrel {
public void singBeforeQuest(){
System.out.println("Falala;Theknightissobrave!");
}
public void singAfterQuest(){
System.out.println("Tee heehe;Thebraveknightdidembarkonaquest!");
}
}
configuration.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="knight" class="com.springinaction.knights.DragonSlayingKnights">
<constructor-arg ref="quest"/>
</bean>
<bean id="quest" class="com.springinaction.knights.DragonSlayingQuest"/>
<bean id="minstrel" class="com.springinaction.knights.Minstrel"/>
<aop:config>
<aop:aspect ref="minstrel">
<aopointcut id="embark" expression="execution(*com.springinaction.knights.Knight.embarkQuest(..)) " />
<aop:before pointcut-ref="embark" method="singBeforeQuest"/>
<aop:after pointcut-ref="embark" method="singAfterQuest"/>
</aop:aspect>
</aop:config>
</beans>
測試文件 - TestKnights.java
package com.test.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlAp plicationContext;
import com.springinaction.knights.Knight;
public class TestKnights {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("configuration.xml");
Knight knight = (Knight) context.getBean("knight");
knight.embarkQuest();
}
}
當我執行TestKnights.java,我得到以下錯誤:
2011年11月5日下午8:59:46 org.springframewor k.context.support.AbstractApplicationContext prepareRefresh 信息:刷新org[email protected]5d764be1:啓動日期[Sat Nov 05 20:59:46 PDT 2011];上下文層次結構的根 2011年11月5日上午8時59分46秒org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息:從類路徑資源[configuration.xml]加載XML bean定義 2011年11月5日8: 59:46 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO:在org.s[email protected]485fcf29中預先實例化單例:定義bean [knight,quest,minstrel,org.springframework .aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,#org.springframework.aop.aspectj.AspectJPointcutAdvisor 1,踏上];工廠層次結構的根 2011年11月5日下午8:59:46 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons 信息:破壞org.s[email protected]485fcf29中的單例:定義bean [騎士,任務,彈琴,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,#org.springframework.aop.aspectj.AspectJPointcutAdvisor 1,踏上];工廠層次結構的根 線程「main」中的異常org.springframework.beans.factory.BeanCreationException:創建在類路徑資源[配置中定義的名稱爲'knight'的bean時出錯。xml]:Bean實例化之前的BeanPostProcessor失敗;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名爲'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0'的bean時出錯:無法創建類型爲[org.springframework.aop的內部bean'(內部bean)' .aspectj.AspectJMethodBeforeAdvice]設置構造函數參數;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名稱爲'(內部bean)'的bean時出錯:無法在設置構造函數參數時解析對bean'引導'的引用;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名爲'embark'的bean時出錯:bean實例化失敗;嵌套的例外是java.lang.NoClassDefFoundError:組織/ AspectJ的/韋弗/反映出/ ReflectionWorld $ ReflectionWorldException 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) 在org.springframework.beans。 factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:293) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory .doGetBean(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultL istableBeanFactory.java:585) 在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 在有機(TestKnights.java:test.spring.TestKnights.main())上的彈簧框架.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139) (org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83) 9) 原因:org.springframework.beans.factory.BeanCreationException:創建名爲'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0'的bean時出錯:無法創建類型爲[org的內部bean'(內部bean)'。 springframework.aop.aspectj.AspectJMet hodBeforeAdvice]設置構造函數參數;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名稱爲'(內部bean)'的bean時出錯:無法在設置構造函數參數時解析對bean'引導'的引用;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名爲'embark'的bean時出錯:bean實例化失敗;嵌套的異常是java.lang.NoClassDefFoundError:org/aspectj/weaver/reflect/ReflectionWorld $ ReflectionWorldException at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:281) at org.springframework.beans。 factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:125) 在org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:630) 在org.springframework.beans.factory.support.ConstructorResolver。 autowireConstructor(ConstructorResolver.java:148) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) at org.springframework.beans.factor y.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。 createBean(AbstractAutowireCapableBeanFactory.java:456) 在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:293) 在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java :222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory。的java:290) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 在org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:86) 在org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:100) 在org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:107) 在org.springframework.aop。 framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:278) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(Abstra ctAutowireCapableBeanFactory.java:848) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:820) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:446) ... 10更多 引起者:org.springframework.beans.factory.BeanCreationException:創建名稱爲'(內部bean)'的bean時出錯:無法在設置構造函數參數時解析對bean'引導'的引用;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名爲'embark'的bean時出錯:bean實例化失敗;嵌套的異常是java.lang.NoClassDefFoundError:org/aspectj/weaver/reflect/ReflectionWorld $ ReflectionWorldException at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) at org.springframework.beans。 factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) 在org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:616) 在org.springframework.beans.factory.support.ConstructorResolver。 autowireConstructor(ConstructorResolver.java:148) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) at org.springframework.beans.factor y.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。 createBean(AbstractAutowireCapableBeanFactory.java:456) 在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270) ...... 28多個 造成的:org.springframework.beans.factory.BeanCreationException:創建名爲'embark'的bean時出錯:Bean實例化失敗;嵌套異常是java.lang.NoClassDefFoundError:org/aspectj/weaver/reflect/ReflectionWorld $ ReflectionWorldException at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965) at org.springframework.beans。 factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。 createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312) at org.springframe在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) ... 36更多 引起的:work.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 引起: java.lang中。NoClassDefFoundError:org/aspectj/weaver/reflect/ReflectionWorld $ ReflectionWorldException at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) at java.lang.Class。 getConstructor0(Class.java:2699) 在java.lang.Class.getDeclaredConstructor(Class.java:1985) 在org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:65) 在有機springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958) ... 42更多 引起:java.lang.ClassNotFoundException:org.aspectj.weaver.reflect.ReflectionWorld $ ReflectionWorldException在java.net.URLClassLoader上運行$ .run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java。 lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) ... 48更多
我覺得還有一個單獨的韋弗罐子。 –