无法在第4行中从Spring运行aspectj示例

时间:2015-04-03 15:34:34

标签: java spring aop aspectj

我对一个方面和其他共同工作的类有以下定义。

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

性能

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。我怎么能运行这个例子?或者我做错了什么?

1 个答案:

答案 0 :(得分:0)

IMO @EnableAspectJAutoProxy对于本地AspectJ方面没有意义。它仅适用于Spring AOP方面。所以你有两个选择:

  • 您可以通过 Ajc (AspectJ编译器)将您的原生AspectJ方面编译到Spring应用程序中。在这种情况下,您不需要任何注释来运行方面,只需在运行时在类路径上运行 aspectjrt.jar
  • 或者你采用Spring手册(第9.8章)中描述的规范方式,并使用LTW(加载时编织)来实现原生AspectJ方面。您可以分别通过@EnableLoadTimeWeaving<context:load-time-weaver/>在配置中启用此功能。见第9.8.4章Load-time weaving with AspectJ in the Spring Framework