Spring AOP程序 - 实例化失败

时间:2011-11-06 04:01:25

标签: java spring aop

我尝试在Spring中创建一个简单的AOP示例。但是,我得到了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.springframework.context.support.AbstractApplicationContext prepareRefresh 信息:刷新org.springframework.context.support.ClassPathXmlApplicationContext@5d764be1:启动日期[2011年11月5日星期六20:59:46 PDT];上下文层次结构的根 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 信息:在org.springframework.beans.factory.support.DefaultListableBeanFactory@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.springframework.beans.factory.support.DefaultListableBeanFactory@485fcf29中销毁单身人士:定义bean [knight,quest,minstrel,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0, org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,踏上];工厂层级的根 线程&#34; main&#34;中的例外情况org.springframework.beans.factory.BeanCreationException:创建名为&#39; knight&#39;的bean时出错在类路径资源[configuration.xml]中定义:bean实例化之前的BeanPostProcessor失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称&#39; org.springframework.aop.aspectj.AspectJPointcutAdvisor创建bean时出错#0&#39;:无法创建内部bean&#39;(内部bean)& #39;设置构造函数参数时类型为[org.springframework.aop.aspectj.AspectJMethodBeforeAdvice];嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为&#39;(内部bean)的bean时出错&#39;:无法解析对bean的引用&#39; embark&#39;设置构造函数参数时;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为&#39;出错的bean时出错:bean的实例化失败;嵌套异常是java.lang.NoClassDefFoundError:org / aspectj / weaver / reflect / ReflectionWorld $ ReflectionWorldException     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452)     at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:293)     在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)     在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)     在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)     在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)     在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)     在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)     在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83)     在com.test.spring.TestKnights.main(TestKnights.java:9) 由以下原因引起:org.springframework.beans.factory.BeanCreationException:使用名称&#39; org.springframework.aop.aspectj.AspectJPointcutAdvisor创建bean时出错#0&#39;:无法创建内部bean&#39;(内部bean)& #39;设置构造函数参数时类型为[org.springframework.aop.aspectj.AspectJMethodBeforeAdvice];嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为&#39;(内部bean)的bean时出错&#39;:无法解析对bean的引用&#39; embark&#39;设置构造函数参数时;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为&#39;出错的bean时出错:bean的实例化失败;嵌套异常是java.lang.NoClassDefFoundError:org / aspectj / weaver / reflect / ReflectionWorld $ ReflectionWorldException     在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:281)     在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:125)     at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:630)     在org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:148)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)     在org.springframework.beans.factory.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)     at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:293)     在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)     在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)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.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:创建名称为&#39;(内部bean)的bean时出错&#39;:无法解析对bean的引用&#39; embark&#39;设置构造函数参数时;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为&#39;出错的bean时出错:bean的实例化失败;嵌套异常是java.lang.NoClassDefFoundError:org / aspectj / weaver / reflect / ReflectionWorld $ ReflectionWorldException     在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)     在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)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)     在org.springframework.beans.factory.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:创建名称为&#39;出错的bean时出错:bean的实例化失败;嵌套异常是java.lang.NoClassDefFoundError:org / aspectj / weaver / reflect / ReflectionWorld $ ReflectionWorldException     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965)     在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)     在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312)     在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)     在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)     ......还有36个 引起: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)     at java.lang.Class.getDeclaredConstructor(Class.java:1985)     在org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:65)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958)     ......还有42个 引起:java.lang.ClassNotFoundException:org.aspectj.weaver.reflect.ReflectionWorld $ ReflectionWorldException     在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)     at java.security.AccessController.doPrivileged(Native Method)     在java.net.URLClassLoader.findClass(URLClassLoader.java:190)     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)     在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)     在java.lang.ClassLoader.loadClass(ClassLoader.java:248)     ......还有48个

7 个答案:

答案 0 :(得分:1)

您需要在类路径上使用AspectJ。它没有Spring。

答案 1 :(得分:1)

尝试将aspectjweaver.jar添加到类路径中。

答案 2 :(得分:0)

下载aspectjweaver.jar并添加到您的类路径中。然后它应该工作。

答案 3 :(得分:0)

我的解决方案是删除aspectj文件夹(Users \ .m2 \ repository \ org \ aspectj for me)并让maven重新下载它。不知道问题是什么......

尽管我的classpath和我的依赖项中有aspectweaver.jar,但我仍然遇到了问题,所以这适用于那些上述解决方案无效的人。

答案 4 :(得分:0)

Spring for Action第1章

正如@ les2所说,aspectj并没有随春天发货。

如果您正在使用maven,请将此依赖项添加到您的pom文件

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

在那之后尝试给它一个旋转

同样适用于所有感兴趣的结帐Habuma's Github。他完成了编写“春天的行动”中的例子的努力。

答案 5 :(得分: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

答案 6 :(得分:0)

对于Java 8来说,完美的解决方案是在pom.xml中添加Aspectjrt和Aspectjtools!

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.7</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>1.8.4</version>
    </dependency>