2015-04-03 2 views
0

У меня есть следующее определение аспекта и других классов, которые сотрудничают.Невозможно запустить пример aspectj из Spring в действии 4th

package concert; 

public aspect CriticAspect { 
    public CriticAspect() {} 

    pointcut performance(): execution(* perform(..)); 


    afterReturning() : performance() { 
     System.out.println(criticismEngine.getCriticism()); 
    } 

    private CriticismEngine criticismEngine; 

    public void setCriticismEngine(CriticismEngine criticismEngine) { 
     this.criticismEngine = criticismEngine; 
    } 

} 

CriticismEngine

package concert; 

public interface CriticismEngine { 
    String getCriticism(); 
} 

CriticismEngineImpl

package concert; 

public class CriticismEngineImpl implements CriticismEngine { 
    public CriticismEngineImpl() {} 

    public String getCriticism() { 
     int i = (int) (Math.random() * criticismPool.length); 
     return criticismPool[i]; 
    } 

    // injected 
    private String[] criticismPool; 
    public void setCriticismPool(String[] criticismPool) { 
     this.criticismPool = criticismPool; 
    } 
} 

Performance

package concert; 

public interface Performance { 
    void perform(); 
} 

PerformanceImple

package concert; 

public class Concert implements Performance { 
    @Override 
    public void perform() { 
     System.out.println("Playing a concert!"); 
    } 
} 

конфигурации

package concert.config; 

import concert.Concert; 
import concert.CriticAspect; 
import concert.CriticismEngine; 
import concert.CriticismEngineImpl; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.EnableAspectJAutoProxy; 

@Configuration 
@EnableAspectJAutoProxy() 
public class ApplicationConfiguration { 
    @Bean 
    public CriticAspect criticAspect() { 
     return CriticAspect.aspectOf(); 
    } 

    @Bean 
    public CriticismEngine criticismEngine() { 
     CriticismEngineImpl criticismEngine = new CriticismEngineImpl(); 
     String[] criticisms = { "Worst performance ever!", 
           "I laughed, I cried, then I realized I was at the wrong show.", 
           "A must see show!" }; 
     criticismEngine.setCriticismPool(criticisms); 
     return criticismEngine; 
    } 

    @Bean 
    public Concert concert() { 
     return new Concert(); 
    } 
} 

Главная

package concert; 

import concert.config.ApplicationConfiguration; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 

public class Main { 

    public static void main(String[] args) { 
     ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class); 
     Performance concert = context.getBean("concert", Performance.class); 
     concert.perform(); 
    } 
} 

Зависимости

compile "org.springframework:spring-context:${springVersion}" 
compile "org.springframework:spring-aop:${springAopVersion}" 
compile "org.aspectj:aspectjrt:${aspectJRuntimeVersion}" 
compile "org.aspectj:aspectjweaver:${aspectJWeaverVersion}" 

Но IntelliJ говорит, что не может найти CriticAspect. Как я могу запустить этот пример? Или я делаю что-то неправильно?

ответ

0

IMO @EnableAspectJAutoProxy не имеет смысла для нативного аспекта AspectJ. Он работает только для аспектов Spring AOP. Так у вас есть два варианта:

  • Либо вы собираете свой родной аспект AspectJ прямо в приложение Spring через AJC (AspectJ компилятор). В этом случае вам не нужны какие-либо аннотации для запуска этих аспектов, только aspectjrt.jar на пути к классам во время выполнения.
  • Или вы идете каноническим способом, описанным в руководстве весны (глава 9.8), и используйте LTW (ткачество с загрузкой) для собственных аспектов AspectJ. Это можно включить в вашей конфигурации через @EnableLoadTimeWeaving или <context:load-time-weaver/>, соответственно. См. Главу 9.8.4, Load-time weaving with AspectJ in the Spring Framework.
+0

Как вы можете видеть, 'AspectJRuntime' находится в моем пути к классам. Я удалил '@ EnableAspectJAutoProxy' и попытался добавить' @ EnableLoadTimeWeaving', однако ничего не помогло. Я думаю, что проблема заключается в идее Intellij - она ​​не использует animj runtime для запуска моей программы, потому что я все еще получаю ту же ошибку, что intellij не может найти символ и указывает на класс аспект класса CriticAspect. Я добавил ss ошибки – ashur

+0

Для аспекта вам нужно использовать * Ajc * в качестве компилятора (как я сказал в своем ответе), а не * Javac *. Вероятно, ваши настройки проекта неверны. Вам нужен грань AspectJ и правильный компилятор. Я рекомендую создать проект Maven, который строит внешний IDEA или Eclipse, а затем просто импортирует его в IDE. Я делаю это с большинством моих проектов AspectJ, потому что у IDEA очень хорошая поддержка Maven. – kriegaex

Смежные вопросы