繁体   English   中英

无法在Spring 4中运行来自Spring的Aspectj示例

[英]Unable to run aspectj example from Spring in action 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;
    }

}

批评引擎

package concert;

public interface CriticismEngine {
    String getCriticism();
}

批评引擎

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

性能不佳

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 我如何运行此示例? 还是我做错了什么?

IMO @EnableAspectJAutoProxy对于本机AspectJ方面没有意义。 它仅适用于Spring AOP方面。 因此,您有两种选择:

  • 您可以通过Ajc (AspectJ编译器)将本机的AspectJ方面直接编译到Spring应用程序中。 在这种情况下,运行时不需要任何注释即可使方面运行,仅需在类路径上的aspectjrt.jar
  • 或者,您可以按照Spring手册(第9.8章)中所述的规范方法进行操作,并对本机AspectJ方面使用LTW(加载时编织)。 可以分别通过@EnableLoadTimeWeaving<context:load-time-weaver/>在配置中启用它。 参见章9.8.4, 在Spring Framework中使用AspectJ进行加载时编织

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM