Spring AOP Program — сбой создания экземпляра

#java #spring #aop

#java #spring #aop

Вопрос:

Я попытался создать простой пример 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>
  

Test File — 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();
    }
}
  

When I execute the TestKnights.java, I get the following error:

5 ноября 2011 8:59:46 вечера org.springframework.context.support.AbstractApplicationContext prepareRefresh ИНФОРМАЦИЯ: Обновление org.springframework.context.support.ClassPathXmlApplicationContext@5d764be1 : дата запуска [Сб Ноя 05 20:59:46 PDT 2011]; корень иерархии контекста 5 ноября 2011 8:59:46 вечера org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions ИНФОРМАЦИЯ: Загрузка определений XML-компонентов из ресурса пути к классу [configuration.xml ] 5 ноября 2011 8:59:46 вечера org.springframework.beans.factory.support.DefaultListableBeanFactory Предварительно создает синглтоны ИНФОРМАЦИЯ: Предварительное создание синглтонов в org.springframework.beans.factory.support.DefaultListableBeanFactory@485fcf29: определение компонентов [knight,quest,minstrel,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,embark]; корень иерархии фабрики 5 ноября 2011 г. 8:59:46 PM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry Уничтожает синглтоны ИНФОРМАЦИЯ: Уничтожение синглтонов в организации.springframework.beans.factory.support.DefaultListableBeanFactory@485fcf29: определение компонентов [knight,quest,minstrel,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor #1,embark]; Исключение из заводской иерархии в потоке «main» org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘knight’, определенным в ресурсе пути к классу [configuration.xml ]: Сбой BeanPostProcessor перед созданием экземпляра компонента; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘org.springframework.aop.aspectj.AspectJPointcutAdvisor #0’: Не удается создать внутренний компонент ‘(inner bean)’ типа [org.springframework.aop.aspectj.Aspectjmethod beforeadvice] при настройке аргумента конструктора; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘(внутренний компонент)’: не удается разрешить ссылку на компонент ’embark’ при установке аргумента конструктора; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ’embark’: сбой создания экземпляра компонента; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение org/aspectj/weaver/reflectionworld$ReflectionWorldException в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) в организации.пружинный каркас.фасоль.фабрика.поддержка.AbstractBeanFactory $1.GetObject(AbstractBeanFactory.java:293) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) в org.springframework.beans.factory.support.Абстрактная пивная фабрика.doGetBean(AbstractBeanFactory.java:290) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) в org.springframework.context.support.Абстрактное приложение context.finishbeanfactoryинициализация(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: ошибка при создании компонента с именем ‘org.springframework.aop.aspectj.AspectJPointcutAdvisor #0’: Не удается создать внутренний компонент ‘(inner bean)’ типа [org.springframework.aop.aspectj.Aspectjmethod beforeadvice] при настройке аргумента конструктора; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘(внутренний компонент)’: не удается разрешить ссылку на компонент ’embark’ при установке аргумента конструктора; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ’embark’: сбой создания экземпляра компонента; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение org/aspectj/weaver/reflectionworld$ReflectionWorldException в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:281) в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolvevalueесли необходимо(BeanDefinitionValueResolver.java:125) в org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:630 ) в организации.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:148 ) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) в org.springframework.beans.factory.support.Автоматически настраиваемый BeanFactory.createBeanInstance (автоматически настраиваемый BeanFactory.java:907) в org.springframework.beans.factory.support.Автоматически настраиваемый BeanFactory.doCreateBean(автоматически настраиваемый BeanFactory.java:485) в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.createBean(абстрактно автоматически настраиваемый BeanFactory.java:456) в 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) в организации.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.Следует перейти (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: ошибка при создании компонента с именем ‘(внутренний компонент)’: не удается разрешить ссылку на компонент ’embark’ при установке аргумента конструктора; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ’embark’: сбой создания экземпляра компонента; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение org/aspectj/weaver/reflectionworld$ReflectionWorldException в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolvevalueесли необходимо(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.Автоматически настраиваемый BeanFactory.createBeanInstance (автоматически настраиваемый BeanFactory.java:907) в org.springframework.beans.factory.support.Автоматически настраиваемый BeanFactory.doCreateBean(автоматически настраиваемый BeanFactory.java:485) в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.createBean(абстрактно автоматически настраиваемый BeanFactory.java:456) в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270) … еще 28 вызвано: org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ’embark’: сбой создания экземпляра компонента; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение org/aspectj/weaver/reflectionworld$ReflectionWorldException в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.instantiateBean(абстрактно автоматически настраиваемый BeanFactory.java:965) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911) в организации.springframework.beans.factory.support.Автоматически настраиваемый BeanFactory.doCreateBean(автоматически настраиваемый BeanFactory.java:485) в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.createBean(абстрактно автоматически настраиваемый BeanFactory.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 в 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.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$1.выполнить(URLClassLoader.java:202) в java.security.AccessController.Допривилегирован (собственный метод) в java.net.URLClassLoader.FindClass(URLClassLoader.java:190) в java.lang.ClassLoader.loadClass(ClassLoader.java:307) в sun.разное.Launcher$AppClassLoader.loadClass(Launcher.java:301) на java.lang.ClassLoader.loadClass(ClassLoader.java:248) … еще 48

Комментарии:

1. Я думаю, что есть еще и отдельная банка для ткачей.

Ответ №1:

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

Комментарии:

1. Проверил это. Это путь к классу. aspectj-1.6.12.jar . Несмотря на это, я получаю ошибку.

Ответ №2:

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

Ответ №3:

Загрузите aspectjweaver.jar и добавьте в свой путь к классу. Тогда это должно сработать.

Ответ №4:

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

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

Ответ №5:

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

Как заявил @les2, aspectj не поставляется с spring.

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

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

Попробуйте запустить его после этого

Также для всех заинтересованных проверьте Habuma’s Github. Он приложил все усилия для компиляции примеров из «Spring в действии»

Ответ №6:

Я добавил 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
  

Ответ №7:

Для Java 8 идеальным решением является добавление aspectjrt и aspectjtools в pom.xml !

     <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>