Arhn - архитектура программирования

AspectJ AOP и Spring вместе

Я хочу использовать AspectJ AOP и Spring (для DI) вместе, но получаю следующее исключение:

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class

Я использую IntelliJ IDEA 12 Ultimate IDE.
Ниже приведены примеры шагов для воспроизведения ошибки.

1: Информационный интерфейс:

package org.example.bugs.bug;

public interface Info {
    public void info();
}

2: Реализация интерфейса:

package org.example.bugs.bug;

public class Informer implements Info {

    @Override
    public void info() {
        System.out.println("Some info from Informer!");
    }
}

3: Аспект:

package org.example.bugs.bug;

public aspect InfoAspect {

    public InfoAspect() {}

    pointcut info() : execution(* org.example.bugs.bug.Informer.info(..));

    after() returning() : info() {
        System.out.println("Information confirmed by InfoAspect!");
    }

}

4: файл spring-config.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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <aop:aspectj-autoproxy />

    <bean id="informer"
          class="org.example.bugs.bug.Informer"/>

    <bean class="org.example.bugs.bug.InfoAspect"
          factory-method="aspectOf"/>

</beans>

5: я запускаю все в следующем основном классе:

package org.example.bugs.bug;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("org/example/bugs/bug/spring-config.xml");
        Info i = (Info) context.getBean("informer");
        i.info();
    }
}

... и я получаю сообщение об ошибке:

2013-03-24 15:46:10 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@f81843: startup date [Sun Mar 24 15:46:10 CET 2013]; root of context hierarchy
2013-03-24 15:46:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [org/example/bugs/bug/spring-config.xml]
2013-03-24 15:46:10 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13ad085: defining beans [org.springframework.aop.config.internalAutoProxyCreator,informer,org.example.bugs.bug.InfoAspect#0]; root of factory hierarchy
2013-03-24 15:46:10 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13ad085: defining beans [org.springframework.aop.config.internalAutoProxyCreator,informer,org.example.bugs.bug.InfoAspect#0]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.example.bugs.bug.InfoAspect] for bean with name 'org.example.bugs.bug.InfoAspect#0' defined in class path resource [org/example/bugs/bug/spring-config.xml]; nested exception is java.lang.ClassNotFoundException: org.example.bugs.bug.InfoAspect
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1266)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:629)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:578)
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1335)
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:901)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at org.example.bugs.bug.Main.main(Main.java:8)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.ClassNotFoundException: org.example.bugs.bug.InfoAspect
    at java.net.URLClassLoader$1.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:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:260)
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:416)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1287)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1258)
    ... 15 more



Что я делаю не так?


Ответы:


1

Поскольку вы пытаетесь использовать pointcut, поддерживаемый Spring AOP, я советую вам использовать для этого Spring AOP. Использование Spring с полным набором функций AspectJ немного сложно, потому что требует плетения советов. Более того, <aop:aspectj-autoproxy /> предназначен для Spring AOP в стиле @AspectJ, но по-прежнему является Spring, проксирующим цели, а не AspectJ.

Поэтому я бы преобразовал примерный аспект, как показано ниже:

@Aspect
public class InfoAspect {

    public InfoAspect() {
    }

    @Pointcut("execution(* prospring3.aop.aspectj.Informer.info(..))")
    void infoPointcut() {

    }

    @AfterReturning("infoPointcut()")
    public void afterReturning(JoinPoint joinPoint) {
        System.out.println("Information confirmed by InfoAspect!");
        System.out.println("joinPoint.getSignature().getName() = " + joinPoint.getSignature().getName());
    }

}

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // use the CGLib instead of Java Proxy
public class AspectJConfig {

    @Bean
    public Info info() {
        return new Informer();
    }

    /**
     * Aspect must be a config as a bean
     * @return the aspect
     */
    @Bean
    public InfoAspect infoAspect() {
        return new InfoAspect();
    }

}

public class InformerTest {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AspectJConfig.class);
        final Info bean = ctx.getBean(Info.class);
        bean.info();
    }

}

Примечание. Включите следующие зависимости в pom.xml.

    <dependency>
        <groupId>aopalliance</groupId>
        <artifactId>aopalliance</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.6.12</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.12</version>
    </dependency>

Регады

24.03.2013

2

Вам не хватает вашего класса InfoAspect..

Разве вы не видели ClassNotFound вместо org.example.bugs.bug.InfoAspect в трассировке стека? Возможно, он не компилируется Aspect J.

Возможно, вам нужен еще один учебник:

http://www.tutorialspoint.com/spring/aspectj_based_aop_appoach.htm

Я хотел бы убедиться, что у вас есть Spring 3 и вы используете последнюю идиому.

24.03.2013
  • У меня есть все необходимые JAR в CLASSPATH, потому что Spring AOP работает нормально. Я думаю, что проблема связана с [factory-method=aspectOf]. Я не знаю, почему скомпилированного InfoAspect не существует? 24.03.2013
  • Чего у вас нет, так это аспекта, который вы пытаетесь создать. Вы понимаете, как работает Aspect-J — он создает байтовый код во время выполнения. Похоже, вы пропустили этот шаг, потому что загрузчик классов не может найти ВАШ InfoAspect. Компилятор/weaver Aspect-J отделен от компилятора Java. 24.03.2013
  • Вот правильная конфигурация IntelliJ . Я забыл о переопределении аспектного пути на уровне модуля. Теперь все работает нормально. Спасибо за вашу помощь. 24.03.2013
  • Я бы предпочел, чтобы вы приняли и проголосовали за ответ на вашу благодарность. Вот как это работает здесь. 24.03.2013
  • @zajjar, не могли бы вы опубликовать решение, чтобы другие могли его найти, ссылка кажется неработающей. 09.06.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..