Java 无法从Spring中运行aspectj示例

Java 无法从Spring中运行aspectj示例,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我对方面和其他协同工作的类有如下定义 package concert; public aspect CriticAspect { public CriticAspect() {} pointcut performance(): execution(* perform(..)); afterReturning() : performance() { System.out.println(criticismEngine.getCriticism());

我对方面和其他协同工作的类有如下定义

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 interface Performance {
    void perform();
}
package concert;

public class Concert implements Performance {
    @Override
    public void perform() {
        System.out.println("Playing a concert!");
    }
}
批评工程实施

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 CriticismEngine {
    String getCriticism();
}
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;

public interface CriticismEngine {
    String getCriticism();
}
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();
    }
}
Main

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
    在您的配置中启用。见第9.8.4章

如您所见,
AspectJRuntime
位于我的类路径上。我删除了
@EnableAspectJAutoProxy
,并尝试添加
@enableloadtimewing
,但没有任何帮助。我认为问题在于Intellij idea——它没有使用aspectj运行时来运行我的程序,因为我仍然会遇到Intellij找不到符号并指向aspect类
CriticAspect
的错误。我为需要使用Ajc作为编译器的方面(正如我在回答中所说的)添加了错误的ss,而不是Javac。您的项目设置可能不正确。您需要一个AspectJ方面和正确的编译器。我建议创建一个Maven项目,在IDEA或Eclipse之外构建,然后将其导入任一IDE。我在我的大多数AspectJ项目中都这样做,因为IDEA有很好的Maven支持。