2011-11-06 99 views
1

我嘗試在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更多

+0

我覺得還有一個單獨的韋弗罐子。 –

回答

1

您需要類路徑上的AspectJ。它不會與春天一起來。

+0

檢查了它。它是類路徑。 AspectJ的1.6.12.jar。儘管如此,我仍然遇到了錯誤。 –

1

嘗試將aspectjweaver.jar添加到您的類路徑中。

0

下載aspectjweaver.jar並添加到您的類路徑中。那麼它應該工作。

0

對我來說,解決辦法是刪除AspectJ的文件夾(用戶\ .m2目錄\庫\組織\ AspectJ的我),並有行家重新下載。不知道是什麼問題是......

我仍然有這個問題,儘管我的類路徑和我相依爲aspectweaver.jar,所以這是對於那些你在上面的解決方案沒有奏效。

0

For Spring in Action chapter 1

由於@ les2曾聲明aspectj不隨彈簧發貨。

如果您正在使用maven這種依賴關係添加到您的POM文件

<dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>{Your-Version}</version> 
    </dependency> 

先給它一個旋轉後

也爲所有關​​心結賬Habuma's Github。他通過編譯實例的精力去從「春天在行動」

0

我加入aspectjrt和aspectjtools到pom.xml的,現在它的工作。

<dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.7.4</version> 
     <scope>runtime</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjtools</artifactId> 
     <version>1.7.4</version> 
    </dependency>enter code here 
相關問題