У меня есть следующее определение аспекта и других классов, которые сотрудничают.Невозможно запустить пример aspectj из Spring в действии 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;
}
}
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!");
}
}
конфигурации
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
. Как я могу запустить этот пример? Или я делаю что-то неправильно?
Как вы можете видеть, 'AspectJRuntime' находится в моем пути к классам. Я удалил '@ EnableAspectJAutoProxy' и попытался добавить' @ EnableLoadTimeWeaving', однако ничего не помогло. Я думаю, что проблема заключается в идее Intellij - она не использует animj runtime для запуска моей программы, потому что я все еще получаю ту же ошибку, что intellij не может найти символ и указывает на класс аспект класса CriticAspect. Я добавил ss ошибки – ashur
Для аспекта вам нужно использовать * Ajc * в качестве компилятора (как я сказал в своем ответе), а не * Javac *. Вероятно, ваши настройки проекта неверны. Вам нужен грань AspectJ и правильный компилятор. Я рекомендую создать проект Maven, который строит внешний IDEA или Eclipse, а затем просто импортирует его в IDE. Я делаю это с большинством моих проектов AspectJ, потому что у IDEA очень хорошая поддержка Maven. – kriegaex