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支持。