Время загрузки Spring Boot не работает во встроенном коте
Я не могу заставить LTW работать в Spring Boot 1.2.2 с Embedded Tomcat.
Мое приложение - это файл WAR, а не файл.JAR. Когда я запускаю в DEBUG, он никогда не останавливается в моем аспекте, даже когда я нажимаю на вызовы, которые должны соответствовать точечным вызовам, поэтому я считаю, что это не работает...
Мой скрипт запуска делает это:
-javaagent:path/to/spring-instrument-xxx.jar -javaagent:path/to/aspectjweaver-1.2.8.jar
В Spring Boot я загружаю этот AOP Config как ApplicationInitializer, так что он сразу находится в родительском ApplicationContext и должен быть там для всего остального контекста моего встроенного веб-приложения tomcat.
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@Configuration
public class AopConfig {
private Log log = LogFactory.getLog(AopConfig.class);
public AopConfig() {
log.info("Creating AopConfig");
}
@Bean
public LoadTimeWeaver loadTimeWeaver() {
log.info("Creating InstrumentationLoadTimeWeaver");
return new InstrumentationLoadTimeWeaver();
}
}
Мой аспект выглядит так:
package my.aop.profiler.MethodTimerAspect;
@Aspect
public class MethodTimerAspect {
private static final String DELIMITER = "|";
private static final String PROFILER = "profiler";
private static final String DATE_FORMAT = "h:mm:ss";
private static final Log LOG = LogFactory.getLog(PROFILER);
public MethodTimerAspect() {}
@Pointcut("execution (* my.web.*Controller.*(..))")
protected void controllers() {}
@Pointcut("execution (* my.services..*Facade.*(..))")
protected void services() {}
@Pointcut("execution (* my.services..*Exchange.*(..))")
protected void data() {}
/**
* If profiling is enabled with trace, it will log the amount of time
* spent in the method
*
* @param joinPoint
* @return Object
* @throws Throwable
*/
@Around("controllers() || services() || data()")
public Object doProfiling(ProceedingJoinPoint joinPoint) throws Throwable {
// (...)
}
}
META-INF/aop.xml моей встроенной WAR это:
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver>
<!-- only weave classes in our application-specific packages -->
<include within="cdot.*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="my.aop.profiler.MethodTimerAspect"/>
</aspects>
</aspectj>
1 ответ
Две идеи:
Возможно, вы хотите изменить одно из ваших pointcut, чтобы также найти подпакеты (используйте
..
синтаксис вместо.
):@Pointcut("execution (* my.web..*Controller.*(..))")
То же самое относится к вашему aop.xml:
<include within="cdot..*"/>
Я предполагаю что my.web
был изменен вами сознательно и фактически читает cdot.something
, потому что в противном случае pointcuts не будет совпадать.