Программа Spring AOP - Инстанция не удалась

Я попытался создать простой пример АОП в Spring. Но я получаю ошибки АОП.

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, я получаю следующую ошибку:

5 ноября 2011 г. 20:59:46 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Обновление org.springframework.context.support.ClassPathXmlApplicationContext@5d764be1: дата запуска [суббота, 05:15]; PDT корень иерархии контекста 5 ноября 2011 г. 20:59:46 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions ИНФОРМАЦИЯ: Загрузка определений компонентов XML из ресурса пути к классу [configuration.xml] 5 ноября 2011 г. 8:59:46 PM org.springframework..internalAutoProxyCreator, org.springframework.aop.aspectj.AspectJPointcutAdvisor # 0, #1 org.springframework.aop.aspectj.AspectJPointcutAdvisor, встать]; корень фабричной иерархии 5 ноября 2011 г. 20:59:46 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons ИНФОРМАЦИЯ: Уничтожение синглетонов в org.springframework.beans.factory.support.DefaultListableBeanFactory kn: defing квест, менестрель,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0, #1 org.springframework.aop.aspectj.AspectJPointcutAdvisor, встать]; корень фабричной иерархии Исключение в потоке "main" org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем 'knight', определенным в ресурсе пути к классу [configuration.xml]: BeanPostProcessor до сбоя создания экземпляра компонента; вложенное исключение: org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': невозможно создать внутренний компонент (внутренний компонент) типа [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] при установке аргумента конструктора; Вложенное исключение: org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем '(внутренний компонент)': невозможно разрешить ссылку на компонент 'embark' при установке аргумента конструктора; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'embark': не удалось создать экземпляр компонента; Вложенное исключение - java.lang.NoClassDefFoundError: org/aspectj/weaver/refle /ReflectionWorld$ReflectionWorldException в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(actap.raf.wef. Поддержка.java:290) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preBjan 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.springframework83.xtml.Pack.Ptext.Ptext.Ptext.Ptext.Ptext..test.spring.TestKnights.main(TestKnights.java:9) Причина: org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем org.springframework.aop.aspectj.AspectJPointcutAdvisor # 0 ': невозможно создать внутренний bean-компонент '(внутренний компонент)' типа [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] при установке аргумента конструктора; Вложенное исключение: org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем '(внутренний компонент)': невозможно разрешить ссылку на компонент 'embark' при установке аргумента конструктора; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'embark': не удалось создать экземпляр компонента; Вложенным исключением является java.lang.NoClassDefFoundError: org/aspectj/weaver/refle /ReflectionWorld$ReflectionWorldException в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDef.Reg.support.BeanDefinitionValueResolver.resolveValueIfNeeded (BeanDefinitionValueResolver.java:125) в org.springframework.beans.factory.support.ConstructorResolver.resolveConstructor.gues. Constructor. 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.j абор) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) в org.springframework.beans.factory.support. factory.support. AbstractAdvisorAutoProxyCreator.java:100) в org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSki р (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.Вакансии org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем '(внутренний компонент)': не удается разрешить ссылку на компонент 'embark' при установке аргумента конструктора; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'embark': не удалось создать экземпляр компонента; Вложенное исключение - java.lang.NoClassDefFoundError: org/aspectj/weaver/refle /ReflectionWorld$ReflectionWorldException в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitioneses.ra.support.BeanDefinitionValueResolver.resolveValueIfNeeded (BeanDefinitionValueResolver.java:106) в org.springframework.beans.factory.support.ConstructorResolver.resolveConstructor.gues. Constructor.Ru 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.doCreateB EAN (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: Ошибка при создании bean-компонента с именем 'embark': сбой при создании экземпляра bean; Вложенное исключение - java.lang.NoClassDefFoundError: org/aspectj/weaver/refle /ReflectionWorld$ReflectionWorldException в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean.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..beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) ... еще 36. Причина: java.lang.NoClassDefFoundError: org/aspectj/weaver/refle /ReflectionWorld$ReflectionWorldException в java.lang.Class.getDeclaredConstructors0(собственный метод) в java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) в java.lang.Class.getConstructor0(Class.java:2699) в java.lang.Class.getDeclaredConstructor(Class.java:1985) в org.springframework.beans.factory.support.Simplestan.instantiate(SimpleInstantiationStrategy.java:65) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958) ... 42-й класс может быть вызван: refle.ReflectionWorld$ReflectionWorldException на java.net.URLClassLoader$1.run(URLClassLoader.java:202) на java.security.AccessController.doPrivileged(собственный метод) на java.net.URLClassLoader.findClass(URLClassLoader.java1: java1: at1: java1: atl.lang.ClassLoader.loadClass(ClassLoader.java:307) на sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) на java.lang.ClassLoader.loadClass(ClassLoader.java:248) ... еще 48

6 ответов

Попробуйте добавить aspectjweaver.jar в ваш путь к классам.

Вам нужен AspectJ на пути к классам. Это не приходит с весны.

Решение для меня состояло в том, чтобы удалить папку aspectj (Users\.m2\repository\org\aspectj для меня) и попросить maven повторно загрузить ее. Понятия не имею, в чем проблема...

У меня все еще была проблема, несмотря на наличие aspectweaver.jar в моем classpath и моих зависимостях, так что это для тех из вас, где вышеупомянутые решения не работали.

Скачать aspectjweaver.jar и добавьте в свой classpath. Тогда это должно работать.

Для 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>

Для весны в действии глава 1

Как сказал @les2 aspectj не поставляется с пружиной.

Если вы используете maven, добавьте эту зависимость в ваш pom-файл.

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

Попробуй после этого повернуть

Также для всех тех, кто заинтересован в оформлении заказа Habuma's Github. Он приложил усилия, чтобы собрать примеры из "Spring in Action"

Я добавил 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
Другие вопросы по тегам