简体   繁体   English

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

[英]Unable to run aspectj example from Spring in action 4th

I have the following definition of an aspect and other classes that are co-working. 我对一个方面和其他共同工作的类有以下定义。

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!");
    }
}

Configuration 组态

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

Main 主要

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

Dependencies 依存关系

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

But intellij says it cannot find CriticAspect . 但是intellij表示找不到CriticAspect How I can run this example ? 我如何运行此示例? Or I'm doing something wrong ? 还是我做错了什么?

IMO @EnableAspectJAutoProxy does not make sense for a native AspectJ aspect. IMO @EnableAspectJAutoProxy对于本机AspectJ方面没有意义。 It only works for Spring AOP aspects. 它仅适用于Spring AOP方面。 So you have two options: 因此,您有两种选择:

  • Either you compile your native AspectJ aspect right into your Spring application via Ajc (AspectJ compiler). 您可以通过Ajc (AspectJ编译器)将本机的AspectJ方面直接编译到Spring应用程序中。 In this case you do not need any annotations to get the aspects running, only aspectjrt.jar on the classpath during runtime. 在这种情况下,运行时不需要任何注释即可使方面运行,仅需在类路径上的aspectjrt.jar
  • Or you go the canonical way described in the Spring manual (chapter 9.8) and use LTW (load-time weaving) for native AspectJ aspects. 或者,您可以按照Spring手册(第9.8章)中所述的规范方法进行操作,并对本机AspectJ方面使用LTW(加载时编织)。 This can be enabled in your configuration via @EnableLoadTimeWeaving or <context:load-time-weaver/> , respectively. 可以分别通过@EnableLoadTimeWeaving<context:load-time-weaver/>在配置中启用它。 See chapter 9.8.4, Load-time weaving with AspectJ in the Spring Framework . 参见章9.8.4, 在Spring Framework中使用AspectJ进行加载时编织

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

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